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 253d7556..0773d437 100644 --- a/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java +++ b/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java @@ -3199,10 +3199,6 @@ public class EstimateService { SimulationEstimateListResponse response = new SimulationEstimateListResponse(); - if (!"T01".equals(objectRequest.getSaleStoreId())) { - objectRequest.setSchSelSaleStoreId(""); - } - // 견적서 목록 조회 List objectList = estimateMapper.selectSimulationEstimateList(objectRequest); diff --git a/src/main/java/com/interplug/qcast/biz/excelDown/ExcelDownController.java b/src/main/java/com/interplug/qcast/biz/excelDown/ExcelDownController.java index 461b1f3f..1b39a02b 100644 --- a/src/main/java/com/interplug/qcast/biz/excelDown/ExcelDownController.java +++ b/src/main/java/com/interplug/qcast/biz/excelDown/ExcelDownController.java @@ -9,7 +9,6 @@ import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import com.interplug.qcast.biz.excelDown.dto.NtrCtsCmpRequest; import com.interplug.qcast.biz.excelDown.dto.NtrCtsCmpResponse; -import com.interplug.qcast.biz.excelDown.dto.QuotItemResponse; import com.interplug.qcast.biz.excelDown.dto.QuotPlanResponse; import com.interplug.qcast.biz.excelDown.dto.QuotRequest; import com.interplug.qcast.biz.excelDown.dto.QuotResponse; @@ -37,13 +36,8 @@ public class ExcelDownController { QuotResponse quotRes = new QuotResponse(); if ("1".equals(quotRequest.getSch_selectType())) { - List quotPlanExclDownData = - excelDownService.selectQuotPlanExclDownData(quotRequest); - List quotItemExclDownData = - excelDownService.selectQuotItemExclDownData(quotRequest); - - quotRes.setQuotPlanList(quotPlanExclDownData); - quotRes.setQuotItemList(quotItemExclDownData); + quotRes.setQuotPlanList(excelDownService.selectQuotPlanExclDownData(quotRequest)); + quotRes.setQuotItemList(excelDownService.selectQuotItemExclDownData(quotRequest)); } else { List quotPlanExclDownData = excelDownService.selectQuotPlanExclDownData2(quotRequest); diff --git a/src/main/java/com/interplug/qcast/biz/excelDown/ExcelDownMapper.java b/src/main/java/com/interplug/qcast/biz/excelDown/ExcelDownMapper.java index 72a13a5b..b96ed7a2 100644 --- a/src/main/java/com/interplug/qcast/biz/excelDown/ExcelDownMapper.java +++ b/src/main/java/com/interplug/qcast/biz/excelDown/ExcelDownMapper.java @@ -10,6 +10,7 @@ import com.interplug.qcast.biz.excelDown.dto.WrntIsncCmplRequest; import com.interplug.qcast.biz.excelDown.dto.WrntIsncCmplResponse; import java.util.List; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; @Mapper interface ExcelDownMapper { @@ -41,6 +42,7 @@ interface ExcelDownMapper { */ List selectQuotItemExclDownData(QuotRequest quotRequest) throws Exception; + /** * 과거데이터_자연재해보상입력 엑셀다운로드 조회 * diff --git a/src/main/java/com/interplug/qcast/biz/excelDown/ExcelDownService.java b/src/main/java/com/interplug/qcast/biz/excelDown/ExcelDownService.java index eb8219e6..65026cd5 100644 --- a/src/main/java/com/interplug/qcast/biz/excelDown/ExcelDownService.java +++ b/src/main/java/com/interplug/qcast/biz/excelDown/ExcelDownService.java @@ -5,9 +5,12 @@ import com.interplug.qcast.config.message.Messages; import com.interplug.qcast.util.ZipFileManager; import jakarta.servlet.http.HttpServletResponse; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; diff --git a/src/main/java/com/interplug/qcast/biz/excelDown/dto/QuotRequest.java b/src/main/java/com/interplug/qcast/biz/excelDown/dto/QuotRequest.java index ea418012..14726807 100644 --- a/src/main/java/com/interplug/qcast/biz/excelDown/dto/QuotRequest.java +++ b/src/main/java/com/interplug/qcast/biz/excelDown/dto/QuotRequest.java @@ -21,4 +21,9 @@ public class QuotRequest { private String sch_saleStoreId; @Schema(description = "영업 담당자명") private String sch_businessChargerCd; + @Schema(description = "페이지 번호 (1부터 시작, null이면 전체 조회)") + private Integer pageNo; + @Schema(description = "페이지당 건수") + private Integer pageSize; + } \ No newline at end of file diff --git a/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/PwrGnrSimController.java b/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/PwrGnrSimController.java index 4b32092c..dd221c7c 100644 --- a/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/PwrGnrSimController.java +++ b/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/PwrGnrSimController.java @@ -1,9 +1,7 @@ package com.interplug.qcast.biz.pwrGnrSimulation; import com.interplug.qcast.biz.estimate.dto.EstimateRequest; -import com.interplug.qcast.biz.pwrGnrSimulation.dto.PwrGnrSimGuideResponse; -import com.interplug.qcast.biz.pwrGnrSimulation.dto.PwrGnrSimRequest; -import com.interplug.qcast.biz.pwrGnrSimulation.dto.PwrGnrSimResponse; +import com.interplug.qcast.biz.pwrGnrSimulation.dto.*; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; @@ -47,4 +45,11 @@ public class PwrGnrSimController { throws Exception { pwrGnrSimService.excelDownload(request, response, estimateRequest); } + + @Operation(description = "발전시뮬레이션 판매점정보 암호화를 처리한다.") + @GetMapping("/encData") + @ResponseStatus(HttpStatus.OK) + public PwrGnrSimEncResponse selectPwrGnrSimulationEncData(PwrGnrSimEncRequest pwrGnrSimEncRequest) throws Exception { + return pwrGnrSimService.selectPwrGnrSimulationEncData(pwrGnrSimEncRequest); + } } diff --git a/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/PwrGnrSimService.java b/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/PwrGnrSimService.java index 39f6c618..e6a454a3 100644 --- a/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/PwrGnrSimService.java +++ b/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/PwrGnrSimService.java @@ -8,6 +8,7 @@ import com.interplug.qcast.biz.pwrGnrSimulation.dto.*; import com.interplug.qcast.config.Exception.ErrorCode; import com.interplug.qcast.config.Exception.QcastException; import com.interplug.qcast.config.message.Messages; +import com.interplug.qcast.util.EncryptUtil; import com.interplug.qcast.util.ExcelUtil; import com.interplug.qcast.util.InterfaceQsp; import com.interplug.qcast.util.PdfUtil; @@ -2614,4 +2615,12 @@ public class PwrGnrSimService { } } + public PwrGnrSimEncResponse selectPwrGnrSimulationEncData(PwrGnrSimEncRequest pwrGnrSimEncRequest) throws Exception { + PwrGnrSimEncResponse encDataResponse = new PwrGnrSimEncResponse(); + + encDataResponse.setEncSaleStoreId(EncryptUtil.encryptAes256(pwrGnrSimEncRequest.getSaleStoreId())); + encDataResponse.setEncUserId(EncryptUtil.encryptAes256(pwrGnrSimEncRequest.getUserId())); + + return encDataResponse; + } } diff --git a/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/dto/PwrGnrSimEncRequest.java b/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/dto/PwrGnrSimEncRequest.java new file mode 100644 index 00000000..7baa38a6 --- /dev/null +++ b/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/dto/PwrGnrSimEncRequest.java @@ -0,0 +1,13 @@ +package com.interplug.qcast.biz.pwrGnrSimulation.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class PwrGnrSimEncRequest { + @Schema(description = "판매점ID") + private String saleStoreId; + + @Schema(description = "사용자아이디") + private String userId; +} diff --git a/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/dto/PwrGnrSimEncResponse.java b/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/dto/PwrGnrSimEncResponse.java new file mode 100644 index 00000000..5d2a628d --- /dev/null +++ b/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/dto/PwrGnrSimEncResponse.java @@ -0,0 +1,13 @@ +package com.interplug.qcast.biz.pwrGnrSimulation.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class PwrGnrSimEncResponse { + @Schema(description = "암호화 판매점 아이디") + private String encSaleStoreId; + + @Schema(description = "암호화 로그인 아이디") + private String encUserId; +} diff --git a/src/main/java/com/interplug/qcast/util/EncryptUtil.java b/src/main/java/com/interplug/qcast/util/EncryptUtil.java new file mode 100644 index 00000000..4e88e712 --- /dev/null +++ b/src/main/java/com/interplug/qcast/util/EncryptUtil.java @@ -0,0 +1,127 @@ +package com.interplug.qcast.util; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.security.MessageDigest; +import java.util.Base64; + +@Component +@Slf4j +public class EncryptUtil { + /** 초기화 비밀번호 */ + @Value("${qsp.aes256.key}") + static String loginPasswordAesKey; + + @Value("${qsp.aes256.key}") + public void setLoginPasswordAesKey(String value) { + loginPasswordAesKey = value; + } + + /** + * 비밀번호를 암호화하는 기능(복호화가 되면 안되므로 SHA-256 인코딩 방식 적용) + * + * @param password 암호화될 패스워드 + * @param id salt로 사용될 사용자 ID 지정 + * @return + * @throws Exception + */ + public static String encryptSha256(String password, String id) { + if (password == null) { + return ""; + } + String enStr = null; + + try { + byte[] hashValue = null; // 해쉬값 + + MessageDigest md = MessageDigest.getInstance("SHA-256"); + + md.reset(); + md.update(id.getBytes()); + + hashValue = md.digest(password.getBytes()); + enStr = new String(Base64.getEncoder().encode(hashValue)); + } catch (Exception e) { + log.error("Sha Util Encrypt Error", e); + } + return enStr; + } + + /** + * AES-256 암호화 + * @param keyword + * @return + */ + public static String encryptAes256(String keyword) { + + return encryptAes256(keyword, loginPasswordAesKey); + } + + /** + * AES-256 암호화 + * @param keyword + * @return + */ + public static String encryptAes256(String keyword, String loginPasswordKey) { + if(StringUtils.isBlank(keyword)) { + return null; + } + String enStr = null; + try { + byte[] keyData = loginPasswordAesKey.getBytes(); + + SecretKey secureKey = new SecretKeySpec(keyData, "AES"); + + Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding"); + c.init(Cipher.ENCRYPT_MODE, secureKey, new IvParameterSpec(loginPasswordKey.substring(0, 16).getBytes())); + + byte[] encrypted = c.doFinal(keyword.getBytes("UTF-8")); + enStr = new String(Base64.getEncoder().encode(encrypted)); + } catch (Exception e) { + log.error("AES Util Encrypt Error", e); + } + return enStr; + } + + + /** + * AES-256 복호화 + * @param keyword + * @return + */ + public static String decryptAes256(String keyword) { + + return decryptAes256(keyword, loginPasswordAesKey); + } + /** + * AES-256 복호화 + * @param keyword + * @return + */ + public static String decryptAes256(String keyword, String loginPasswordKey) { + if(StringUtils.isBlank(keyword)) { + return null; + } + + String deStr = null; + try { + byte[] keyData = loginPasswordAesKey.getBytes(); + SecretKey secureKey = new SecretKeySpec(keyData, "AES"); + Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding"); + c.init(Cipher.DECRYPT_MODE, secureKey, new IvParameterSpec(loginPasswordKey.substring(0, 16).getBytes("UTF-8"))); + + byte[] byteStr = Base64.getDecoder().decode(keyword.getBytes()); + deStr = new String(c.doFinal(byteStr), "UTF-8"); + } catch (Exception e) { + log.error("AES Util Decrypt Error", e); + } + return deStr; + } +} \ No newline at end of file diff --git a/src/main/resources/mappers/estimate/estimateMapper.xml b/src/main/resources/mappers/estimate/estimateMapper.xml index e8d80aa4..3eb695a9 100644 --- a/src/main/resources/mappers/estimate/estimateMapper.xml +++ b/src/main/resources/mappers/estimate/estimateMapper.xml @@ -1549,7 +1549,7 @@ /* sqlid : com.interplug.qcast.api.excelDown.selectQuotPlanExclDownData (견적엑셀다운로드 플랜정보 데이터 조회) */ - SELECT - B.OBJECT_NO /* 물건번호 物件番号 */ - , A.PLAN_NO /* 플랜 案件番号 */ - , CONVERT(varchar, A.LAST_EDIT_DATETIME, 120) AS LAST_EDIT_DATETIME /* 플랜정보 최신 갱신일시 プラン情報最新更新日時 */ - , G.SALE_STORE_NAME /* 판매대리점 販売代理店 */ - , Y.SALE_STORE_NAME AS SOLD_SALE_STORE_NAME /* 1차대리점명 一次代理店名 */ - , Y.SALE_STORE_ID AS SOLD_SALE_STORE_ID /* 1차대리점ID 一次代理店ID */ - , B.OBJECT_NAME /* 물건명 物件名 */ - , CASE WHEN A.NORTH_ARRANGEMENT = 1 THEN '有' ELSE '無' END AS NORTH_ARRANGEMENT /* 북면배치 北面配置 */ - , CAST(D.WORK_NO AS varchar) + ' ' + D.WORK_PROGRESS_STATUS_NAME AS WORK_PROGRESS_STATUS_NAME /* 수주예상 受注見込 */ - , B.ZIP_NO /* 우편번호 郵便番号 */ - , E.PREF_NAME /* 도도부현 都道府県 */ - , B.ADDRESS /* 주소 住所 */ - , A.WEATHER_POINT /* 가상지점 気象地点 */ - , CAST(A.CAPACITY AS varchar) + 'kw' AS CAPACITY /* 용량 容量 */ - , B.REMARKS /* 비고 備考 */ - , CONVERT(varchar, B.ESTIMATE_DETAIL_CREATE_DATE, 120) AS ESTIMATE_DETAIL_CREATE_DATE /* 견적 작성일 見積作成日 */ - , CONVERT(varchar, B.SPECIFICATION_CONFIRM_DATE, 120) AS SPECIFICATION_CONFIRM_DATE /* 사양 확인일 仕様確認日 */ - , COALESCE(L.BUSINESS_CHARGER, '') AS BUSINESS_CHARGER /* 영업 담당자(판매점 등록) 営業担当者_販売店登録 */ - , COALESCE(M.BUSINESS_TEAM, '') AS BUSINESS_TEAM /* 영업팀(판매점 등록) 営業チーム_販売店登録 */ - , (CASE WHEN UPPER(#{langCd}) = 'JA' THEN C1.CODE_JP - ELSE C1.CODE_NM - END) AS OBJECT_STATUS /* 주택구분 住宅区分 */ - , CONVERT(varchar, B.MANAGER_LAST_EDIT_DATETIME, 120) AS MANAGER_LAST_EDIT_DATETIME /* 관리자 최종 갱신일시管理者最終更新日時 */ - , X.SALE_STORE_ID /* 최종갱신판매점ID 最終更新販売店ID */ - , A.LAST_EDIT_USER /* 최종갱신자 最終更新者 */ - , (CASE WHEN UPPER(#{langCd}) = 'JA' THEN C2.CODE_JP - ELSE C2.CODE_NM - END) AS ROF_TYP /* 지붕종류 屋根種類 */ - , CASE WHEN A.DIFF_ROOF_ENABLED = 1 THEN A.ROOF_MATERIAL_ID_MULTI ELSE COALESCE((CASE WHEN UPPER(#{langCd}) = 'JA' THEN C3.CODE_JP - ELSE C3.CODE_NM - END), '') END AS ROOF_MATERIAL_NM /* 지붕재 屋根材 */ - , CASE WHEN A.DIFF_ROOF_ENABLED = 1 THEN A.SUPPORT_MEAKER_MULTI ELSE A.SUPPORT_MEAKER END AS SUPPORT_MEAKER_NM /* 가대메이커 架台メーカ */ - , CASE WHEN A.DIFF_ROOF_ENABLED = 1 THEN A.SUPPORT_METHOD_ID_MULTI ELSE COALESCE(P.NAME, '') END AS SUPPORT_METHOD_NM /* 지지금구 支持金具 */ - , A.SNOWFALL /* 적설수준 積雪レベル */ - , (CASE WHEN UPPER(#{langCd}) = 'JA' THEN C4.CODE_JP - ELSE C4.CODE_NM - END) AS CNS_LVL /* 시공레벨 施工レベル */ - , U.HEIGHT /* 설치높이 設置高さ */ - , W.MENSODO AS CTND_CLSF /* 면조도구분 面粗度区分 */ - , V.CAPACITY AS ATH_CPC /* 인정용량 認定容量 */ - , (CASE - WHEN G.FIRST_AGENT_FLG = '1' THEN '1' - WHEN G.SECOND_AGENT_FLG = '1' THEN '2' - ELSE '' END ) + '次店' AS SALE_STORE_LEVEL /* 판매점모녀관계 販売店親子関係 */ - , H.DIRECTION /* 방위 方位 */ - , H.MODULE_TYPE /* 모듈종류 モジュール種類 */ - , H.MODULE_NUM /* 설치매수 設置枚数 */ - , H.ROOF_ANGLE /* 지붕경사 屋根勾配 */ - , H.PC_TYPE /* 파워콘종류 パワコン種類 */ - , H.PC_NUM /* 파워콘대수 パワコン台数 */ - , H.BOX_TYPE /* 접속상자종류 接続箱種類 */ - , H.BOX_NUM /* 접속상자수 接続箱数 */ - , H.CABLE_TYPE /* 케이블종류 ケーブル種類 */ - , H.CABLE_NUM /* 케이블개수 ケーブル本数 */ - , H.BOOST_TYPE /* 승압회로종류 昇圧回路種類 */ - , H.BOOST_NUM /* 승압회로대수 昇圧回路台数 */ - , H.DISPLAY_TYPE /* 표시유닛종류 表示ユニット種類 */ - , H.DISPLAY_NUM /* 표시유닛대수 表示ユニット数 */ - , H.COST_ALL /* 재료구입가격(kW단가) 材料仕入価格 */ - , H.COST_MODULE /* 모듈구입가격(kW단가) モジュール仕入価格 */ - , H.COST_OTHER /* 주변기기구입가격 周辺機器仕入価格 */ - , H.COST_STAND /* 가대구입가격(kW단가)架台仕入価格 */ - , H.SALE_ALL /* 판매단가(kW단가)販売単価 */ - , H.SALE_MODULE /* 모듈판매가격(kW단가) モジュール販売価格 */ - , H.SALE_OTHER /* 주변기기 판매가격(kW단가) 周辺機器販売価格 */ - , H.SALE_STAND /* 가대판매가격 架台販売価格 */ - - FROM T_OBJECT B - LEFT OUTER JOIN T_OBJECT_INFO OI - ON OI.OBJECT_NO = B.OBJECT_NO - LEFT OUTER JOIN T_PLAN A - ON A.OBJECT_NO = B.OBJECT_NO - LEFT OUTER JOIN M_COMM_L C1 - ON C1.CODE = B.OBJECT_STATUS_ID - AND C1.HEAD_CD = '201700' - LEFT OUTER JOIN M_WORK_PROGRESS D - ON B.WORK_NO = D.WORK_NO - LEFT OUTER JOIN T_SIMULATION_PREFECTURE E - ON B.PREF_ID = E.PREF_ID - - LEFT OUTER JOIN M_SALES_STORE G - ON B.SALE_STORE_ID = G.SALE_STORE_ID /*본인정보*/ - LEFT OUTER JOIN T_STATISTICS H - ON A.OBJECT_NO = H.OBJECT_NO - and A.PLAN_NO = H.PLAN_NO - - - - LEFT OUTER JOIN M_BUSINESS_CHARGER L - ON G.BUSINESS_CHARGER_CD = L.BUSINESS_CHARGER_CD - LEFT OUTER JOIN M_BUSINESS_TEAM M - ON L.BUSINESS_TEAM_CD = M.BUSINESS_TEAM_CD - LEFT OUTER JOIN M_COMM_L C2 - ON C2.CODE = A.ROOF_KIND_ID - AND C2.HEAD_CD = '201800' - LEFT OUTER JOIN M_COMM_L C3 - ON C3.CODE = A.ROOF_MATERIAL_ID - AND C3.HEAD_CD = '201900' - LEFT OUTER JOIN M_SUPPORT_METHOD P - ON A.SUPPORT_METHOD_ID = P.SUPPORT_METHOD_ID - LEFT OUTER JOIN M_COMM_L C4 - ON C4.CODE = A.CONSTRUCT_SPECIFICATION - AND C4.HEAD_CD = '201300' - - - - LEFT OUTER JOIN T_ROOF_INSTALLED_HEIGHT U - ON A.OBJECT_NO = U.OBJECT_NO - LEFT OUTER JOIN T_APPROVAL_CAPATICY V - ON A.OBJECT_NO = V.OBJECT_NO - AND A.PLAN_NO = V.PLAN_NO - LEFT OUTER JOIN T_MENSODO W - ON A.OBJECT_NO = W.OBJECT_NO - LEFT OUTER JOIN M_USER X - ON A.LAST_EDIT_USER = X.USER_ID - LEFT OUTER JOIN M_SALES_STORE Y - ON G.FIRST_AGENT_ID = Y.SALE_STORE_ID /*1차점정보*/ - WHERE A.DEL_FLG = 0 - AND (B.DEL_FLG = 0 OR (OI.SOURCE_ORIGIN = 'QCAST_III' AND OI.ORG_DEL_FLG = '0')) + SELECT * FROM ( + SELECT + ROW_NUMBER() OVER (ORDER BY B.OBJECT_NO, A.PLAN_NO) AS RN + , B.OBJECT_NO /* 물건번호 物件番号 */ + , A.PLAN_NO /* 플랜 案件番号 */ + , CONVERT(varchar, A.LAST_EDIT_DATETIME, 120) AS LAST_EDIT_DATETIME /* 플랜정보 최신 갱신일시 プラン情報最新更新日時 */ + , G.SALE_STORE_NAME /* 판매대리점 販売代理店 */ + , Y.SALE_STORE_NAME AS SOLD_SALE_STORE_NAME /* 1차대리점명 一次代理店名 */ + , Y.SALE_STORE_ID AS SOLD_SALE_STORE_ID /* 1차대리점ID 一次代理店ID */ + , B.OBJECT_NAME /* 물건명 物件名 */ + , CASE WHEN A.NORTH_ARRANGEMENT = 1 THEN '有' ELSE '無' END AS NORTH_ARRANGEMENT /* 북면배치 北面配置 */ + , CAST(D.WORK_NO AS varchar) + ' ' + D.WORK_PROGRESS_STATUS_NAME AS WORK_PROGRESS_STATUS_NAME /* 수주예상 受注見込 */ + , B.ZIP_NO /* 우편번호 郵便番号 */ + , E.PREF_NAME /* 도도부현 都道府県 */ + , B.ADDRESS /* 주소 住所 */ + , A.WEATHER_POINT /* 가상지점 気象地点 */ + , CAST(A.CAPACITY AS varchar) + 'kw' AS CAPACITY /* 용량 容量 */ + , B.REMARKS /* 비고 備考 */ + , CONVERT(varchar, B.ESTIMATE_DETAIL_CREATE_DATE, 120) AS ESTIMATE_DETAIL_CREATE_DATE /* 견적 작성일 見積作成日 */ + , CONVERT(varchar, B.SPECIFICATION_CONFIRM_DATE, 120) AS SPECIFICATION_CONFIRM_DATE /* 사양 확인일 仕様確認日 */ + , COALESCE(L.BUSINESS_CHARGER, '') AS BUSINESS_CHARGER /* 영업 담당자(판매점 등록) 営業担当者_販売店登録 */ + , COALESCE(M.BUSINESS_TEAM, '') AS BUSINESS_TEAM /* 영업팀(판매점 등록) 営業チーム_販売店登録 */ + , (CASE WHEN UPPER(#{langCd}) = 'JA' THEN C1.CODE_JP + ELSE C1.CODE_NM + END) AS OBJECT_STATUS /* 주택구분 住宅区分 */ + , CONVERT(varchar, B.MANAGER_LAST_EDIT_DATETIME, 120) AS MANAGER_LAST_EDIT_DATETIME /* 관리자 최종 갱신일시管理者最終更新日時 */ + , X.SALE_STORE_ID /* 최종갱신판매점ID 最終更新販売店ID */ + , A.LAST_EDIT_USER /* 최종갱신자 最終更新者 */ + , (CASE WHEN UPPER(#{langCd}) = 'JA' THEN C2.CODE_JP + ELSE C2.CODE_NM + END) AS ROF_TYP /* 지붕종류 屋根種類 */ + , CASE WHEN A.DIFF_ROOF_ENABLED = 1 THEN A.ROOF_MATERIAL_ID_MULTI ELSE COALESCE((CASE WHEN UPPER(#{langCd}) = 'JA' THEN C3.CODE_JP + ELSE C3.CODE_NM + END), '') END AS ROOF_MATERIAL_NM /* 지붕재 屋根材 */ + , CASE WHEN A.DIFF_ROOF_ENABLED = 1 THEN A.SUPPORT_MEAKER_MULTI ELSE A.SUPPORT_MEAKER END AS SUPPORT_MEAKER_NM /* 가대메이커 架台メーカ */ + , CASE WHEN A.DIFF_ROOF_ENABLED = 1 THEN A.SUPPORT_METHOD_ID_MULTI ELSE COALESCE(P.NAME, '') END AS SUPPORT_METHOD_NM /* 지지금구 支持金具 */ + , A.SNOWFALL /* 적설수준 積雪レベル */ + , (CASE WHEN UPPER(#{langCd}) = 'JA' THEN C4.CODE_JP + ELSE C4.CODE_NM + END) AS CNS_LVL /* 시공레벨 施工レベル */ + , U.HEIGHT /* 설치높이 設置高さ */ + , W.MENSODO AS CTND_CLSF /* 면조도구분 面粗度区分 */ + , V.CAPACITY AS ATH_CPC /* 인정용량 認定容量 */ + , (CASE + WHEN G.FIRST_AGENT_FLG = '1' THEN '1' + WHEN G.SECOND_AGENT_FLG = '1' THEN '2' + ELSE '' END ) + '次店' AS SALE_STORE_LEVEL /* 판매점모녀관계 販売店親子関係 */ + , H.DIRECTION /* 방위 方位 */ + , H.MODULE_TYPE /* 모듈종류 モジュール種類 */ + , H.MODULE_NUM /* 설치매수 設置枚数 */ + , H.ROOF_ANGLE /* 지붕경사 屋根勾配 */ + , H.PC_TYPE /* 파워콘종류 パワコン種類 */ + , H.PC_NUM /* 파워콘대수 パワコン台数 */ + , H.BOX_TYPE /* 접속상자종류 接続箱種類 */ + , H.BOX_NUM /* 접속상자수 接続箱数 */ + , H.CABLE_TYPE /* 케이블종류 ケーブル種類 */ + , H.CABLE_NUM /* 케이블개수 ケーブル本数 */ + , H.BOOST_TYPE /* 승압회로종류 昇圧回路種類 */ + , H.BOOST_NUM /* 승압회로대수 昇圧回路台数 */ + , H.DISPLAY_TYPE /* 표시유닛종류 表示ユニット種類 */ + , H.DISPLAY_NUM /* 표시유닛대수 表示ユニット数 */ + , H.COST_ALL /* 재료구입가격(kW단가) 材料仕入価格 */ + , H.COST_MODULE /* 모듈구입가격(kW단가) モジュール仕入価格 */ + , H.COST_OTHER /* 주변기기구입가격 周辺機器仕入価格 */ + , H.COST_STAND /* 가대구입가격(kW단가)架台仕入価格 */ + , H.SALE_ALL /* 판매단가(kW단가)販売単価 */ + , H.SALE_MODULE /* 모듈판매가격(kW단가) モジュール販売価格 */ + , H.SALE_OTHER /* 주변기기 판매가격(kW단가) 周辺機器販売価格 */ + , H.SALE_STAND /* 가대판매가격 架台販売価格 */ + + FROM T_OBJECT B + LEFT OUTER JOIN T_OBJECT_INFO OI + ON OI.OBJECT_NO = B.OBJECT_NO + LEFT OUTER JOIN T_PLAN A + ON A.OBJECT_NO = B.OBJECT_NO + LEFT OUTER JOIN M_COMM_L C1 + ON C1.CODE = B.OBJECT_STATUS_ID + AND C1.HEAD_CD = '201700' + LEFT OUTER JOIN M_WORK_PROGRESS D + ON B.WORK_NO = D.WORK_NO + LEFT OUTER JOIN T_SIMULATION_PREFECTURE E + ON B.PREF_ID = E.PREF_ID + + LEFT OUTER JOIN M_SALES_STORE G + ON B.SALE_STORE_ID = G.SALE_STORE_ID /*본인정보*/ + LEFT OUTER JOIN T_STATISTICS H + ON A.OBJECT_NO = H.OBJECT_NO + and A.PLAN_NO = H.PLAN_NO + + + + LEFT OUTER JOIN M_BUSINESS_CHARGER L + ON G.BUSINESS_CHARGER_CD = L.BUSINESS_CHARGER_CD + LEFT OUTER JOIN M_BUSINESS_TEAM M + ON L.BUSINESS_TEAM_CD = M.BUSINESS_TEAM_CD + LEFT OUTER JOIN M_COMM_L C2 + ON C2.CODE = A.ROOF_KIND_ID + AND C2.HEAD_CD = '201800' + LEFT OUTER JOIN M_COMM_L C3 + ON C3.CODE = A.ROOF_MATERIAL_ID + AND C3.HEAD_CD = '201900' + LEFT OUTER JOIN M_SUPPORT_METHOD P + ON A.SUPPORT_METHOD_ID = P.SUPPORT_METHOD_ID + LEFT OUTER JOIN M_COMM_L C4 + ON C4.CODE = A.CONSTRUCT_SPECIFICATION + AND C4.HEAD_CD = '201300' + + + + LEFT OUTER JOIN T_ROOF_INSTALLED_HEIGHT U + ON A.OBJECT_NO = U.OBJECT_NO + LEFT OUTER JOIN T_APPROVAL_CAPATICY V + ON A.OBJECT_NO = V.OBJECT_NO + AND A.PLAN_NO = V.PLAN_NO + LEFT OUTER JOIN T_MENSODO W + ON A.OBJECT_NO = W.OBJECT_NO + LEFT OUTER JOIN M_USER X + ON A.LAST_EDIT_USER = X.USER_ID + LEFT OUTER JOIN M_SALES_STORE Y + ON G.FIRST_AGENT_ID = Y.SALE_STORE_ID /*1차점정보*/ + WHERE A.DEL_FLG = 0 + AND (B.DEL_FLG = 0 OR (OI.SOURCE_ORIGIN = 'QCAST_III' AND OI.ORG_DEL_FLG = '0')) + + ) AS PAGED + + WHERE RN BETWEEN (#{pageNo} - 1) * #{pageSize} + 1 AND #{pageNo} * #{pageSize} + + + + AND B.ESTIMATE_DETAIL_CREATE_DATE =]]> #{sch_startDt} + ' 00:00:00' AND B.ESTIMATE_DETAIL_CREATE_DATE #{sch_endDt} + ' 23:59:59' @@ -190,7 +200,7 @@ AND G.BUSINESS_CHARGER_CD = #{sch_businessChargerCd} - +