Compare commits
No commits in common. 'main' and 'dev' have entirely different histories.
@ -1,26 +0,0 @@
|
||||
### intellij multi-project 설정 : mens-api의 profile local-ccn 인 경우
|
||||
|
||||
![](.\md_image\before-launch.png)
|
||||
|
||||
1. Edit configurations > 설정할 mens-api 모듈 선택
|
||||
2. Modify options 클릭 > 하단의 'Before Launch' 항목의 'Add before launch task' 선택
|
||||
3. Run maven goal 선택
|
||||
|
||||
![](.\md_image\maven-goals.png)
|
||||
|
||||
4. Working directoy > 멀티프로젝트의 해당 모듈 선택
|
||||
5. Command line > 아래의 maven task 입력
|
||||
|
||||
```text
|
||||
resources:resources -P local-ccn
|
||||
```
|
||||
|
||||
6. OK 선택 저장
|
||||
|
||||
|
||||
7. Modify options > Operating System 항목의 'Working directory' 선택
|
||||
8. 아래의 내용 입력
|
||||
|
||||
```text
|
||||
$MODULE_WORKING_DIR$
|
||||
```
|
@ -1,110 +0,0 @@
|
||||
/**
|
||||
INSERT INTO tb_elctrn_ntic_sndng
|
||||
(`ELCTRN_NTIC_SNDNG_ID`, `SIGNGU_CODE`, `NHT_TMPLAT_ID`, `SNDNG_TY_CODE`, `SNDNG_CO`, `SNDNG_PROCESS_STTUS`, `SNDNG_DT`, `CLOS_DT`, `REGIST_DT`, `REGISTER`, `UPDT_DT`, `UPDUSR`, `error_cn`, `error_dtls`)
|
||||
VALUES
|
||||
('202400000001', '51110', 'JU001', '1', 1, '01', '20240805141253', '20240930235959', '2024-08-05 14:10:53', NULL, '2024-08-07 18:05:51', 'ENS_SYS', NULL, NULL);
|
||||
|
||||
INSERT INTO tb_elctrn_ntic_sndng_detail
|
||||
(`ELCTRN_NTIC_SNDNG_DETAIL_ID`, `ELCTRN_NTIC_SNDNG_ID`, `SIGNGU_CODE`, `MAIN_CODE`, `IHIDNUM`, `CN_DETAIL`, `MOBILE_PAGE_CN`, `REGIST_DT`, `REGISTER`, `UPDT_DT`, `UPDUSR`, `external_document_uuid`)
|
||||
VALUES
|
||||
('51110202400335801001', '202400000001', '51110', '5111020240033580', 'RUNCNjEwM0JERENGMEMzNjRBOTAyMERERjg5MDFEODc=', NULL, '{"details":[{"title":"주정차 위반 과태료 사전통지서","item_type":"TEXT","elements":[""]},{"title":"단속사진","item_type":"IMAGE","print_type":"SLIDE","elements":[{"key":"사진0","value":"http://noparking.chuncheon.go.kr/ens/img/prnt?link=http://152.99.141.24:30001/JUCHA_PHOTO/DATA/IMAGE/51110/51110/2024/5111020240033580A.jpg","level":0},{"key":"사진1","value":"http://noparking.chuncheon.go.kr/ens/img/prnt?link=http://152.99.141.24:30001/JUCHA_PHOTO/DATA/IMAGE/51110/51110/2024/5111020240033580B.jpg","level":1},{"key":"사진2","value":"http://noparking.chuncheon.go.kr/ens/img/prnt?link=http://152.99.141.24:30001/JUCHA_PHOTO/DATA/IMAGE/51110/51110/2024/5111020240033580C.jpg","level":2},{"key":"사진3","value":"http://noparking.chuncheon.go.kr/ens/img/prnt?link=http://152.99.141.24:30001/JUCHA_PHOTO/DATA/IMAGE/51110/51110/2024/5111020240033580D.jpg","level":3}]},{"title":"위반내역","item_type":"KEY_VALUE","properties":{"hyperlink":["https://www.wetax.go.kr"],"style":{"highlight":{"562-245-79175307":{"use-clipboard":"true"}}}},"elements":[{"key":"차량번호","value":"56거4441","level":1},{"key":"성명","value":"김정우","level":1},{"key":"위반일시","value":"2024-08-04 10:37","level":1},{"key":"위반내용","value":"주정차금지 구역","level":1},{"key":"위반장소","value":"퇴계동 퇴계로 부근","level":1},{"key":"납부금액","value":"32,000원","level":1},{"key":"단속구분","value":"이동형CCTV 033-250-3194,3800","level":1},{"key":"가상계좌","value":"신한 : 56224579175307\\n농협 : 79027653322219\\n우리 : 73171602792160\\n하나 : 61809652351237","level":1},{"key":"자진납부 및 의견제출기한","value":"2024-09-04\\n위 납부 기한이 경과시에는 과태료 감경 혜택을 받으실 수 없습니다.","level":1},{"key":"위택스","value":"https://www.wetax.go.kr","level":1}]},{"title":"자동차 등록별 과태료 부과 및 감경기준","item_type":"TABLE","elements":{"head":["구분","승용\\\\n부과금액","승용\\\\n감경후금액","승합\\\\n부과금액","승합\\\\n감경후금액"],"rows":[["주정차금지구역\\\\n(어린이보호구역 내)","40,000원\\\\n(120,000원)","32,000원\\\\n(96,000원)","50,000원\\\\n(130,000원)","40,000원\\\\n(104,000원)"],["같은 장소 2시간 초과\\\\n(어린이보호구역 내)","50,000원\\\\n(130,000원)","40,000원\\\\n(104,000원)","60,000원\\\\n(140,000원)","48,000원\\\\n(112,000원)"]]}},{"title":"질서위반행위 규제법 시행령 규정 감경 대상","item_type":"TABLE","elements":{"head":["감경대상자","시행일 및 적용대상","감경율(%)","비고"],"rows":[["○ 국민기초생활 수급자\\\\n○ 한부모가족 보호대상자\\\\n○ 장애의 정도가 심한 장애인\\\\n○ 국가유공자(상이등급 3급 이상)\\\\n○ 미성년자","○ 시행일 : 2010년 1월 16일 부터\\\\n○ 적용 : 시행일 이후 단속된 차량","○ 과태료 부과금액의 50%","※ 자진 납부 시 추가감경 가능"]]}}]}', '2024-08-05 14:10:53', NULL, NULL, NULL, 'B-202408051411000827Wmtv000000001');
|
||||
commit;
|
||||
*/
|
||||
|
||||
select *
|
||||
from tb_elctrn_ntic_sndng;
|
||||
select *
|
||||
from tb_elctrn_ntic_sndng_detail;
|
||||
|
||||
select *
|
||||
from tb_ens_unity_sndng_mastr;
|
||||
select *
|
||||
from tb_ens_unity_sndng_detail;
|
||||
select *
|
||||
from tb_ens_ci;
|
||||
|
||||
select *
|
||||
from tb_ens_tmplat_manage;
|
||||
|
||||
/** 접수 reset */
|
||||
select * from tb_elctrn_ntic_sndng;
|
||||
select * from tb_ens_unity_sndng_mastr;
|
||||
select * from tb_ens_unity_sndng_detail;
|
||||
select * from tb_ens_ci;
|
||||
|
||||
select * from tb_ens_sndng_mastr;
|
||||
|
||||
select * from tb_ens_ihidnum_manage;
|
||||
select * from tb_ens_ci_manage;
|
||||
|
||||
|
||||
select *
|
||||
from tb_ens_ci_manage;
|
||||
|
||||
select *
|
||||
from tb_ens_ihidnum_manage;
|
||||
select *
|
||||
from tb_ens_ci_manage;
|
||||
|
||||
select tecm.ci
|
||||
from tb_ens_ihidnum_manage teim
|
||||
LEFT join tb_ens_ci_manage tecm
|
||||
ON teim.ihidnum_manage_id = tecm.ihidnum_manage_id
|
||||
where teim.ihidnum = 'RUNCNjEwM0JERENGMEMzNjRBOTAyMERERjg5MDFEODc=';
|
||||
|
||||
SELECT tecm.ci
|
||||
FROM tb_ens_ihidnum_manage teim
|
||||
LEFT JOIN tb_ens_ci_manage tecm
|
||||
ON teim.ihidnum_manage_id = tecm.ihidnum_manage_id
|
||||
WHERE teim.ihidnum = '8312181157213';
|
||||
|
||||
SELECT teim.ihidnum_manage_id AS ihidnumManageId
|
||||
, tecm.ci
|
||||
FROM tb_ens_ihidnum_manage teim
|
||||
LEFT JOIN tb_ens_ci_manage tecm
|
||||
ON teim.ihidnum_manage_id = tecm.ihidnum_manage_id
|
||||
WHERE teim.ihidnum = 'RUNCNjEwM0JERENGMEMzNjRBOTAyMERERjg5MDFEODc=';
|
||||
|
||||
|
||||
SELECT tesm.sndng_mastr_id
|
||||
, tesm.unity_sndng_mastr_id
|
||||
, tesm.tmplat_id
|
||||
, tesm.sndng_co
|
||||
, tesm.try_seq
|
||||
, tesm.sndng_process_sttus
|
||||
, teusm.try1
|
||||
, teusm.try2
|
||||
, teusm.try3
|
||||
, teusm.try_cnt
|
||||
FROM tb_ens_sndng_mastr tesm
|
||||
JOIN tb_ens_unity_sndng_mastr teusm
|
||||
ON tesm.unity_sndng_mastr_id = teusm.unity_sndng_mastr_id
|
||||
WHERE tesm.sndng_process_sttus IN ('send-ok', 'sending1', 'sending2')
|
||||
AND tesm.signgu_code = '51110'
|
||||
AND tesm.ffnlg_code = '11';
|
||||
|
||||
SELECT tekmd.document_binder_uuid
|
||||
FROM tb_ens_sndng_mastr tesm
|
||||
JOIN tb_ens_kakao_my_doc tekmd
|
||||
ON tesm.sndng_mastr_id = tekmd.sndng_mastr_id
|
||||
WHERE tesm.sndng_process_sttus IN ('send-ok', 'sending1', 'sending2')
|
||||
AND tesm.unity_sndng_mastr_id = '3094'
|
||||
AND IFNULL(tekmd.document_binder_uuid, '') != ''
|
||||
AND tesm.signgu_code = '51110'
|
||||
AND tesm.ffnlg_code = '11';
|
||||
|
||||
|
||||
select * from ens_snd_mast;
|
||||
select * from ENS_SND_DTL_KT_GBS;
|
||||
|
||||
|
||||
SELECT tempm.sndng_detail_id
|
||||
, tempm.sndng_se_code
|
||||
, tempm.mobile_page_cn
|
||||
, tekmd.signgu_code
|
||||
, tekmd.ffnlg_code
|
||||
FROM tb_ens_kakao_d10 tekmd
|
||||
JOIN tb_ens_mobile_page_manage tempm
|
||||
ON tekmd.sndng_detail_id = tempm.sndng_detail_id
|
||||
WHERE tekmd.envelope_id = 'EVLP-01J5YX9QNMS3Y8D3QZTB51NMMN-00'
|
||||
AND tekmd.external_id = '4413311202408230033';
|
@ -1,201 +0,0 @@
|
||||
/**
|
||||
INSERT INTO tb_elctrn_ntic_sndng
|
||||
(`ELCTRN_NTIC_SNDNG_ID`, `SIGNGU_CODE`, `NHT_TMPLAT_ID`, `SNDNG_TY_CODE`, `SNDNG_CO`, `SNDNG_PROCESS_STTUS`, `SNDNG_DT`, `CLOS_DT`, `REGIST_DT`, `REGISTER`, `UPDT_DT`, `UPDUSR`, `error_cn`, `error_dtls`)
|
||||
VALUES
|
||||
('202400000001', '51110', 'JU001', '1', 1, '01', '20240805141253', '20240930235959', '2024-08-05 14:10:53', NULL, '2024-08-07 18:05:51', 'ENS_SYS', NULL, NULL);
|
||||
|
||||
INSERT INTO tb_elctrn_ntic_sndng_detail
|
||||
(`ELCTRN_NTIC_SNDNG_DETAIL_ID`, `ELCTRN_NTIC_SNDNG_ID`, `SIGNGU_CODE`, `MAIN_CODE`, `IHIDNUM`, `CN_DETAIL`, `MOBILE_PAGE_CN`, `REGIST_DT`, `REGISTER`, `UPDT_DT`, `UPDUSR`, `external_document_uuid`)
|
||||
VALUES
|
||||
('51110202400335801001', '202400000001', '51110', '5111020240033580', 'RUNCNjEwM0JERENGMEMzNjRBOTAyMERERjg5MDFEODc=', NULL, '{"details":[{"title":"주정차 위반 과태료 사전통지서","item_type":"TEXT","elements":[""]},{"title":"단속사진","item_type":"IMAGE","print_type":"SLIDE","elements":[{"key":"사진0","value":"http://noparking.chuncheon.go.kr/ens/img/prnt?link=http://152.99.141.24:30001/JUCHA_PHOTO/DATA/IMAGE/51110/51110/2024/5111020240033580A.jpg","level":0},{"key":"사진1","value":"http://noparking.chuncheon.go.kr/ens/img/prnt?link=http://152.99.141.24:30001/JUCHA_PHOTO/DATA/IMAGE/51110/51110/2024/5111020240033580B.jpg","level":1},{"key":"사진2","value":"http://noparking.chuncheon.go.kr/ens/img/prnt?link=http://152.99.141.24:30001/JUCHA_PHOTO/DATA/IMAGE/51110/51110/2024/5111020240033580C.jpg","level":2},{"key":"사진3","value":"http://noparking.chuncheon.go.kr/ens/img/prnt?link=http://152.99.141.24:30001/JUCHA_PHOTO/DATA/IMAGE/51110/51110/2024/5111020240033580D.jpg","level":3}]},{"title":"위반내역","item_type":"KEY_VALUE","properties":{"hyperlink":["https://www.wetax.go.kr"],"style":{"highlight":{"562-245-79175307":{"use-clipboard":"true"}}}},"elements":[{"key":"차량번호","value":"56거4441","level":1},{"key":"성명","value":"김정우","level":1},{"key":"위반일시","value":"2024-08-04 10:37","level":1},{"key":"위반내용","value":"주정차금지 구역","level":1},{"key":"위반장소","value":"퇴계동 퇴계로 부근","level":1},{"key":"납부금액","value":"32,000원","level":1},{"key":"단속구분","value":"이동형CCTV 033-250-3194,3800","level":1},{"key":"가상계좌","value":"신한 : 56224579175307\\n농협 : 79027653322219\\n우리 : 73171602792160\\n하나 : 61809652351237","level":1},{"key":"자진납부 및 의견제출기한","value":"2024-09-04\\n위 납부 기한이 경과시에는 과태료 감경 혜택을 받으실 수 없습니다.","level":1},{"key":"위택스","value":"https://www.wetax.go.kr","level":1}]},{"title":"자동차 등록별 과태료 부과 및 감경기준","item_type":"TABLE","elements":{"head":["구분","승용\\\\n부과금액","승용\\\\n감경후금액","승합\\\\n부과금액","승합\\\\n감경후금액"],"rows":[["주정차금지구역\\\\n(어린이보호구역 내)","40,000원\\\\n(120,000원)","32,000원\\\\n(96,000원)","50,000원\\\\n(130,000원)","40,000원\\\\n(104,000원)"],["같은 장소 2시간 초과\\\\n(어린이보호구역 내)","50,000원\\\\n(130,000원)","40,000원\\\\n(104,000원)","60,000원\\\\n(140,000원)","48,000원\\\\n(112,000원)"]]}},{"title":"질서위반행위 규제법 시행령 규정 감경 대상","item_type":"TABLE","elements":{"head":["감경대상자","시행일 및 적용대상","감경율(%)","비고"],"rows":[["○ 국민기초생활 수급자\\\\n○ 한부모가족 보호대상자\\\\n○ 장애의 정도가 심한 장애인\\\\n○ 국가유공자(상이등급 3급 이상)\\\\n○ 미성년자","○ 시행일 : 2010년 1월 16일 부터\\\\n○ 적용 : 시행일 이후 단속된 차량","○ 과태료 부과금액의 50%","※ 자진 납부 시 추가감경 가능"]]}}]}', '2024-08-05 14:10:53', NULL, NULL, NULL, 'B-202408051411000827Wmtv000000001');
|
||||
commit;
|
||||
*/
|
||||
|
||||
select *
|
||||
from tb_elctrn_ntic_sndng;
|
||||
select *
|
||||
from tb_elctrn_ntic_sndng_detail;
|
||||
|
||||
select *
|
||||
from tb_ens_unity_sndng_mastr;
|
||||
select *
|
||||
from tb_ens_unity_sndng_detail;
|
||||
select *
|
||||
from tb_ens_ci;
|
||||
|
||||
select *
|
||||
from tb_ens_tmplat_manage;
|
||||
|
||||
/** 접수 reset */
|
||||
select * from tb_elctrn_ntic_sndng;
|
||||
select * from tb_ens_unity_sndng_mastr;
|
||||
select * from tb_ens_unity_sndng_detail;
|
||||
select * from tb_ens_ci;
|
||||
|
||||
select * from tb_ens_sndng_mastr;
|
||||
|
||||
select * from tb_ens_ihidnum_manage;
|
||||
select * from tb_ens_ci_manage;
|
||||
|
||||
|
||||
select *
|
||||
from tb_ens_ci_manage;
|
||||
|
||||
select *
|
||||
from tb_ens_ihidnum_manage;
|
||||
select *
|
||||
from tb_ens_ci_manage;
|
||||
|
||||
select tecm.ci
|
||||
from tb_ens_ihidnum_manage teim
|
||||
LEFT join tb_ens_ci_manage tecm
|
||||
ON teim.ihidnum_manage_id = tecm.ihidnum_manage_id
|
||||
where teim.ihidnum = 'RUNCNjEwM0JERENGMEMzNjRBOTAyMERERjg5MDFEODc=';
|
||||
|
||||
SELECT tecm.ci
|
||||
FROM tb_ens_ihidnum_manage teim
|
||||
LEFT JOIN tb_ens_ci_manage tecm
|
||||
ON teim.ihidnum_manage_id = tecm.ihidnum_manage_id
|
||||
WHERE teim.ihidnum = '8312181157213';
|
||||
|
||||
SELECT teim.ihidnum_manage_id AS ihidnumManageId
|
||||
, tecm.ci
|
||||
FROM tb_ens_ihidnum_manage teim
|
||||
LEFT JOIN tb_ens_ci_manage tecm
|
||||
ON teim.ihidnum_manage_id = tecm.ihidnum_manage_id
|
||||
WHERE teim.ihidnum = 'RUNCNjEwM0JERENGMEMzNjRBOTAyMERERjg5MDFEODc=';
|
||||
|
||||
|
||||
SELECT tesm.sndng_mastr_id
|
||||
, tesm.unity_sndng_mastr_id
|
||||
, tesm.tmplat_id
|
||||
, tesm.sndng_co
|
||||
, tesm.try_seq
|
||||
, tesm.sndng_process_sttus
|
||||
, teusm.try1
|
||||
, teusm.try2
|
||||
, teusm.try3
|
||||
, teusm.try_cnt
|
||||
FROM tb_ens_sndng_mastr tesm
|
||||
JOIN tb_ens_unity_sndng_mastr teusm
|
||||
ON tesm.unity_sndng_mastr_id = teusm.unity_sndng_mastr_id
|
||||
WHERE tesm.sndng_process_sttus IN ('send-ok', 'sending1', 'sending2')
|
||||
AND tesm.signgu_code = '51110'
|
||||
AND tesm.ffnlg_code = '11';
|
||||
|
||||
SELECT tekmd.document_binder_uuid
|
||||
FROM tb_ens_sndng_mastr tesm
|
||||
JOIN tb_ens_kakao_my_doc tekmd
|
||||
ON tesm.sndng_mastr_id = tekmd.sndng_mastr_id
|
||||
WHERE tesm.sndng_process_sttus IN ('send-ok', 'sending1', 'sending2')
|
||||
AND tesm.unity_sndng_mastr_id = '3094'
|
||||
AND NVL(tekmd.document_binder_uuid, '') != ''
|
||||
AND tesm.signgu_code = '51110'
|
||||
AND tesm.ffnlg_code = '11';
|
||||
|
||||
|
||||
select * from ens_snd_mast;
|
||||
select * from TB_ELCTRN_NTIC_SNDNG_RESULT;
|
||||
select * from ENS_SND_DTL_KT_GBS;
|
||||
select * from TB_ELCTRN_NTIC_SNDNG;
|
||||
select * from TB_ELCTRN_NTIC_SNDNG_DETAIL;
|
||||
|
||||
|
||||
SELECT signgu_code, /* 시군구코드 */
|
||||
ffnlg_code, /* 과태료코드 */
|
||||
client_id, /* nice client id */
|
||||
client_secret, /* app security code */
|
||||
product_id, /* 상품 코드 */
|
||||
access_token, /* access token */
|
||||
expires_in, /* access token 만료일시(초)*/
|
||||
token_type, /* token type */
|
||||
scope, /* token scope */
|
||||
site_code, /* 공개키 사이트 코드 */
|
||||
key_version, /* 공개키 버전 */
|
||||
public_key, /* 공개키 */
|
||||
TO_CHAR(TO_DATE(null, 'YYYYMMDDHH24MISS') - INTERVAL '1' HOUR, 'YYYYMMDDHH24MISS') AS validDtim, /* 공개키 만료일시 */
|
||||
cur_symkey_version, /* 현재 대칭키 버전 */
|
||||
TO_CHAR(TO_DATE('', 'YYYYMMDDHH24MISS') - INTERVAL '1' HOUR, 'YYYYMMDDHH24MISS') AS curSymkeyValidDtim, /* 현재 대칭키 만료일시 */
|
||||
cur_symkey_key, /* 현재 대칭키 - key */
|
||||
cur_symkey_iv, /* 현재 대칭키 - iv */
|
||||
cur_symkey_hmac_key, /* 현재 대칭키 - hmac_key */
|
||||
bef_symkey_version, /* 이전 대칭키 버전 */
|
||||
bef_symkey_valid_dtim, /* 이전 대칭키 만료일시 */
|
||||
bef_symkey_key, /* 이전 대칭키 - key */
|
||||
bef_symkey_iv, /* 이전 대칭키 - iv */
|
||||
bef_symkey_hmac_key /* 이전 대칭키 - hmac_key */
|
||||
FROM tb_cmm_nice_instn_crtf_info;
|
||||
-- WHERE signgu_code = #{signguCode}
|
||||
-- AND ffnlg_code = #{ffnlgCode}
|
||||
|
||||
|
||||
|
||||
|
||||
select * from tb_ens_rlaybsnm_manage;
|
||||
|
||||
|
||||
SELECT signgu_code, /* 시군구코드 */
|
||||
ffnlg_code, /* 과태료코드 */
|
||||
signgu_nm, /* 시군구 명 */
|
||||
ffnlg_nm, /* 과태료 명 */
|
||||
kakao_client_id, /* 카카오 Client ID */
|
||||
kakao_product_cd, /* 카카오 상품 코드 */
|
||||
kakao_access_token, /* 카카오 access token */
|
||||
kakao_contract_uuid, /* 카카오 contract uuid */
|
||||
kakao_partner_rest_api_key, /* 카카오 partner key */
|
||||
kakao_dealer_rest_api_key, /* 카카오 dealer key */
|
||||
-- CASE WHEN #{profile} = 'prod' THEN kakao_prod_settle_id ELSE kakao_dev_settle_id END AS kakaoSettleId, /* 카카오 settle id */
|
||||
kt_client_id, /* KT client id */
|
||||
kt_client_tp, /* KT client tp */
|
||||
kt_scope, /* KT scope */
|
||||
kt_service_code, /* KT service code */
|
||||
-- CASE WHEN #{profile} = 'prod' THEN kt_prod_client_id ELSE kt_dev_client_id END AS ktSvcClientId, /* KT client service ID */
|
||||
-- CASE WHEN #{profile} = 'prod' THEN kt_prod_client_secret ELSE kt_dev_client_secret END AS ktSvcClientSecret, /* KT client service secret */
|
||||
TO_DATE(updt_dt INTERVAL IF(#{profile} = 'prod', kt_prod_token_expires_in, kt_dev_token_expires_in) - 86400 SECOND)
|
||||
END AS ktTokenExpiresIn, /* KT 토큰 유효기간 : (7775999)(90일) */
|
||||
epost_service_key, /* epost service key */
|
||||
pplus_api_key, /* postplus api key */
|
||||
sender_nm, /* 발송인 명 */
|
||||
sender_zip_no, /* 발송인 우편 번호 */
|
||||
sender_addr, /* 발송인 주소 */
|
||||
sender_detail_addr /* 발송인 상세 주소 */
|
||||
FROM tb_ens_rlaybsnm_manage;
|
||||
|
||||
|
||||
select updt_dt,kt_prod_token_expires_in,kt_dev_token_expires_in,
|
||||
updt_dt + (
|
||||
CASE
|
||||
WHEN '' = 'prod' THEN kt_prod_token_expires_in
|
||||
ELSE kt_dev_token_expires_in
|
||||
END - 86400) / 86400
|
||||
from tb_ens_rlaybsnm_manage;
|
||||
|
||||
|
||||
SELECT tempm.sndng_detail_id
|
||||
, tempm.sndng_se_code
|
||||
, tempm.mobile_page_cn
|
||||
, tekmd.signgu_code
|
||||
, tekmd.ffnlg_code
|
||||
FROM tb_ens_kakao_d10 tekmd
|
||||
JOIN tb_ens_mobile_page_manage tempm
|
||||
ON tekmd.sndng_detail_id = tempm.sndng_detail_id
|
||||
WHERE tekmd.envelope_id = 'EVLP-01J5YX9QNMS3Y8D3QZTB51NMMN-00'
|
||||
AND tekmd.external_id = '4413311202408230033';
|
||||
|
||||
|
||||
UPDATE tb_ens_kt_gbs
|
||||
SET mms_sndg_rslt_sqno = '#{mmsSndgRsltSqno} ' /* MMS 발송 결과 상태 순번 - 1:수신시, 2:발송시*/
|
||||
, prcs_dt =' #{prcsDt} ' /* 처리일자 */
|
||||
, mbl_bzowr_dvcd = '#{mblBzowrDvcd}' /* 모바일 사업자 구분 : 01:KT, 02:SKT, 03:LGT */
|
||||
, rl_mms_sndg_telno = '#{rlMmsSndgTelno}' /* 실제 발송 번호 */
|
||||
, mms_rslt_dvcd = '#{mmsRsltDvcd} ' /* 발송결과코드 */
|
||||
--, mms_sndg_rslt_dvcd_msg = #{mmsRsltDvcdMsg} /* 발송결과코드 메세지 */
|
||||
, mms_sndg_tmst = mms_sndg_tmst /* 발송 타임 스탬프 */
|
||||
, mms_rcv_tmst = mms_rcv_tmst /* 수신 타임 스탬프 */
|
||||
, mms_rdg_tmst = mms_rdg_tmst /* 열람 타임 스탬프 */
|
||||
, updt_dt = sysdate
|
||||
, updusr = 'api_inbound'
|
||||
WHERE unity_sndng_detail_id = '';
|
||||
|
||||
|
||||
select * from tb_ens_rlaybsnm_manage;
|
@ -1,124 +0,0 @@
|
||||
insert into tb_ens_mobile_page_manage
|
||||
select concat('KKO', send_detail_id)
|
||||
, 'KKO-MY-DOC'
|
||||
, details
|
||||
, regist_dt
|
||||
, 'system'
|
||||
from ens_snd_dtl_mbl_page;
|
||||
|
||||
|
||||
insert into tb_ens_unity_sndng_mastr
|
||||
select (select c.elctrn_ntic_sndng_id from ens_snd_dtl_kko_md b inner join tb_elctrn_ntic_sndng_detail c on b.prop_external_document_uuid=c.external_document_uuid where a.send_mast_id = b.send_mast_id limit 1)
|
||||
, '51110'
|
||||
, '11'
|
||||
, tmplt_cd
|
||||
, 'ENS'
|
||||
, send_cnt
|
||||
, 'send_ok' -- stat_cd
|
||||
, date_format(send_dt, '%Y%m%d%H%i%S')
|
||||
, ''
|
||||
, ''
|
||||
, 'KKO-MY-DOC'
|
||||
, ''
|
||||
, ''
|
||||
, '1'
|
||||
, date_format(close_dt, '%Y%m%d%H%i%S')
|
||||
, ''
|
||||
, ''
|
||||
, regist_dt
|
||||
, 'system'
|
||||
, last_updt_dt
|
||||
, 'system'
|
||||
from ens_snd_mast a
|
||||
where stat_cd IN ('open', 'sendcmplt');
|
||||
|
||||
|
||||
insert into tb_ens_unity_sndng_detail
|
||||
select (select b.elctrn_ntic_sndng_detail_id from tb_elctrn_ntic_sndng_detail b where a.prop_external_document_uuid=b.external_document_uuid)
|
||||
, (select c.elctrn_ntic_sndng_id from ens_snd_dtl_kko_md b inner join tb_elctrn_ntic_sndng_detail c on b.prop_external_document_uuid=c.external_document_uuid where a.send_mast_id = b.send_mast_id limit 1)
|
||||
, '51110'
|
||||
, '11'
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, (select mobile_page_cn from tb_ens_mobile_page_manage b where b.sndng_detail_id=concat('KKO', a.send_detail_id))
|
||||
, ''
|
||||
, prop_external_document_uuid
|
||||
, regist_dt
|
||||
, 'system'
|
||||
, last_updt_dt
|
||||
, 'system'
|
||||
from ens_snd_dtl_kko_md a
|
||||
where send_mast_id in (select send_mast_id from ens_snd_mast where stat_cd IN ('open', 'sendcmplt'));
|
||||
|
||||
|
||||
insert into tb_ens_sndng_mastr
|
||||
select concat('KKO', send_mast_id)
|
||||
, (select c.elctrn_ntic_sndng_id from ens_snd_dtl_kko_md b inner join tb_elctrn_ntic_sndng_detail c on b.prop_external_document_uuid=c.external_document_uuid where a.send_mast_id = b.send_mast_id limit 1)
|
||||
, '51110'
|
||||
, '11'
|
||||
, tmplt_cd
|
||||
, 'ENS'
|
||||
, 'KKO-MY-DOC'
|
||||
, send_cnt
|
||||
, '1'
|
||||
, '1'
|
||||
, 'send_ok' -- stat_cd
|
||||
, date_format(send_dt, '%Y%m%d%H%i%S')
|
||||
, date_format(close_dt, '%Y%m%d%H%i%S')
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, null
|
||||
, ''
|
||||
, regist_dt
|
||||
, 'system'
|
||||
, last_updt_dt
|
||||
, 'system'
|
||||
from ens_snd_mast a
|
||||
where stat_cd IN ('open', 'sendcmplt');
|
||||
|
||||
|
||||
insert into tb_ens_kakao_my_doc
|
||||
select concat('KKO', send_detail_id)
|
||||
, (select b.elctrn_ntic_sndng_detail_id from tb_elctrn_ntic_sndng_detail b where a.prop_external_document_uuid=b.external_document_uuid)
|
||||
, concat('KKO', send_mast_id)
|
||||
, '51110'
|
||||
, '11'
|
||||
, title
|
||||
, hash
|
||||
, common_categories
|
||||
, read_expiread_at
|
||||
, recv_ci
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, recv_is_require_vfy_name
|
||||
, prop_link
|
||||
, prop_payload
|
||||
, prop_message
|
||||
, prop_cs_number
|
||||
, prop_cs_name
|
||||
, prop_external_document_uuid
|
||||
, document_binder_uuid
|
||||
, error_code
|
||||
, error_message
|
||||
, kko_doc_stat
|
||||
, unix_timestamp(kko_doc_sent_dt)
|
||||
, unix_timestamp(kko_doc_received_dt)
|
||||
, unix_timestamp(kko_doc_auth_frst_dt)
|
||||
, unix_timestamp(kko_doc_token_vrfy_frst_dt)
|
||||
, unix_timestamp(kko_doc_read_frst_dt)
|
||||
, unix_timestamp(kko_doc_user_notied_dt)
|
||||
, regist_dt
|
||||
, 'system'
|
||||
, last_updt_dt
|
||||
, 'system'
|
||||
from ens_snd_dtl_kko_md a
|
||||
where send_mast_id in (select send_mast_id from ens_snd_mast where stat_cd IN ('open', 'sendcmplt'));
|
@ -1,362 +0,0 @@
|
||||
create table TB_ENS_KT_GBS
|
||||
(
|
||||
SNDNG_MASTR_ID VARCHAR2(20) not null,
|
||||
SNDNG_DETAIL_ID VARCHAR2(20) not null,
|
||||
UNITY_SNDNG_DETAIL_ID VARCHAR2(20),
|
||||
SIGNGU_CODE CHAR(5),
|
||||
FFNLG_CODE VARCHAR2(2),
|
||||
SERVICE_CD VARCHAR2(5),
|
||||
MSG_CD VARCHAR2(5),
|
||||
MAKE_DT VARCHAR2(14),
|
||||
DATA_CNT NUMBER(8),
|
||||
SNDN_EX_TIME VARCHAR2(14),
|
||||
EX_TIME VARCHAR2(14),
|
||||
SND_TEL_NO VARCHAR2(20),
|
||||
M_TYPE VARCHAR2(10),
|
||||
MSG_TYPE VARCHAR2(1),
|
||||
OPT_TYPE VARCHAR2(1),
|
||||
SRC_KEY VARCHAR2(50),
|
||||
SRC_SEQ VARCHAR2(8),
|
||||
SCI VARCHAR2(88),
|
||||
MMS_DTL_CNTS VARCHAR2(4000),
|
||||
MMS_TITLE VARCHAR2(40),
|
||||
RCS_DTL_CNTS VARCHAR2(4000),
|
||||
URL VARCHAR2(1000),
|
||||
DOC_HASH VARCHAR2(100),
|
||||
MDN VARCHAR2(11),
|
||||
MMS_SNDG_RSLT_SQNO VARCHAR2(8),
|
||||
PRCS_DT VARCHAR2(8),
|
||||
MMS_BSNS_DVCD VARCHAR2(5),
|
||||
MBL_BZOWR_DVCD VARCHAR2(2),
|
||||
RL_MMS_SNDG_TELNO VARCHAR2(20),
|
||||
MMS_RSLT_DVCD VARCHAR2(20),
|
||||
MMS_SNDG_TMST VARCHAR2(14),
|
||||
MMS_RCV_TMST VARCHAR2(14),
|
||||
MMS_RDG_TMST VARCHAR2(14),
|
||||
PREV_APPROVE_YN VARCHAR2(4),
|
||||
RESULT_CD VARCHAR2(2),
|
||||
RESULT_DT VARCHAR2(14),
|
||||
ERROR_MSG VARCHAR2(255),
|
||||
REGIST_DT DATE,
|
||||
REGISTER VARCHAR2(20),
|
||||
UPDT_DT DATE,
|
||||
UPDUSR VARCHAR2(20),
|
||||
constraint PK_TB_ENS_KT_BC_GBS
|
||||
primary key (SNDNG_MASTR_ID, SNDNG_DETAIL_ID)
|
||||
);
|
||||
|
||||
comment on table TB_ENS_KT_GBS is 'GBS 공인 알림 문자';
|
||||
comment on column TB_ENS_KT_GBS.SNDNG_MASTR_ID is '발송 마스터 ID';
|
||||
comment on column TB_ENS_KT_GBS.SNDNG_DETAIL_ID is '발송 상세 ID';
|
||||
comment on column TB_ENS_KT_GBS.UNITY_SNDNG_DETAIL_ID is '통합 발송 상세 ID';
|
||||
comment on column TB_ENS_KT_GBS.SIGNGU_CODE is '시군구 코드';
|
||||
comment on column TB_ENS_KT_GBS.FFNLG_CODE is '과태료 코드';
|
||||
comment on column TB_ENS_KT_GBS.SERVICE_CD is '기관코드';
|
||||
comment on column TB_ENS_KT_GBS.MSG_CD is '문서코드';
|
||||
comment on column TB_ENS_KT_GBS.MAKE_DT is '생성일시';
|
||||
comment on column TB_ENS_KT_GBS.DATA_CNT is '회차전체데이터건수';
|
||||
comment on column TB_ENS_KT_GBS.SNDN_EX_TIME is '발송마감시간';
|
||||
comment on column TB_ENS_KT_GBS.EX_TIME is '열람마감시간';
|
||||
comment on column TB_ENS_KT_GBS.SND_TEL_NO is '발신번호(서비스기관)(발송전화번호)';
|
||||
comment on column TB_ENS_KT_GBS.M_TYPE is '문서종류(sms,lms,mms)';
|
||||
comment on column TB_ENS_KT_GBS.MSG_TYPE is '발송메세지타입';
|
||||
comment on column TB_ENS_KT_GBS.OPT_TYPE is '메시지 발송구분';
|
||||
comment on column TB_ENS_KT_GBS.SRC_KEY is '관리키';
|
||||
comment on column TB_ENS_KT_GBS.SRC_SEQ is 'SRC_SEQ';
|
||||
comment on column TB_ENS_KT_GBS.SCI is 'CI';
|
||||
comment on column TB_ENS_KT_GBS.MMS_DTL_CNTS is 'MMS상세내용';
|
||||
comment on column TB_ENS_KT_GBS.MMS_TITLE is 'MMS제목';
|
||||
comment on column TB_ENS_KT_GBS.RCS_DTL_CNTS is 'RCS 메시지 상세내용';
|
||||
comment on column TB_ENS_KT_GBS.URL is '연결URL';
|
||||
comment on column TB_ENS_KT_GBS.DOC_HASH is '문서해시';
|
||||
comment on column TB_ENS_KT_GBS.MDN is '개인휴대전화번호';
|
||||
comment on column TB_ENS_KT_GBS.MMS_SNDG_RSLT_SQNO is 'MMS발송결과상태순번 (1:수신,2:열람)';
|
||||
comment on column TB_ENS_KT_GBS.PRCS_DT is '처리일자';
|
||||
comment on column TB_ENS_KT_GBS.MMS_BSNS_DVCD is '문서코드';
|
||||
comment on column TB_ENS_KT_GBS.MBL_BZOWR_DVCD is '모바일사업자구분 (01:KT,02:SKT,03:LGT)';
|
||||
comment on column TB_ENS_KT_GBS.RL_MMS_SNDG_TELNO is '실제발송번호(일부)';
|
||||
comment on column TB_ENS_KT_GBS.MMS_RSLT_DVCD is '발송결과코드';
|
||||
comment on column TB_ENS_KT_GBS.MMS_SNDG_TMST is '발송 타임 스탬프';
|
||||
comment on column TB_ENS_KT_GBS.MMS_RCV_TMST is '수신 타임 스탬프';
|
||||
comment on column TB_ENS_KT_GBS.MMS_RDG_TMST is '열람 타임 스탬프';
|
||||
comment on column TB_ENS_KT_GBS.PREV_APPROVE_YN is '기동의발송여부';
|
||||
comment on column TB_ENS_KT_GBS.RESULT_CD is '처리결과';
|
||||
comment on column TB_ENS_KT_GBS.RESULT_DT is '응답처리일자';
|
||||
comment on column TB_ENS_KT_GBS.ERROR_MSG is '오류 메시지';
|
||||
comment on column TB_ENS_KT_GBS.REGIST_DT is '등록 일시';
|
||||
comment on column TB_ENS_KT_GBS.REGISTER is '등록자';
|
||||
comment on column TB_ENS_KT_GBS.UPDT_DT is '수정 일시';
|
||||
comment on column TB_ENS_KT_GBS.UPDUSR is '수정자';
|
||||
|
||||
-- 자료 이관
|
||||
|
||||
insert into tb_ens_mobile_page_manage
|
||||
select concat('KKO', send_detail_id)
|
||||
, 'KKO-MY-DOC'
|
||||
, details
|
||||
, to_char(regist_dt, 'yyyymmddhh24miss')
|
||||
, 'system'
|
||||
from ens_snd_dtl_mbl_page
|
||||
where post_se='kkoMydoc';
|
||||
|
||||
insert into tb_ens_mobile_page_manage
|
||||
select concat('KTG', send_detail_id)
|
||||
, 'KT-GBS'
|
||||
, details
|
||||
, to_char(regist_dt, 'yyyymmddhh24miss')
|
||||
, 'system'
|
||||
from ens_snd_dtl_mbl_page
|
||||
where post_se='ktGibis';
|
||||
|
||||
insert into tb_ens_unity_sndng_mastr
|
||||
select (select c.elctrn_ntic_sndng_id from ens_snd_dtl_kko_md b inner join tb_elctrn_ntic_sndng_detail c on b.prop_external_document_uuid=c.external_document_uuid where a.send_mast_id = b.send_mast_id and rownum = 1)
|
||||
, org_cd
|
||||
, '11'
|
||||
, tmplt_cd
|
||||
, 'ENS'
|
||||
, send_cnt
|
||||
, 'send_ok' -- stat_cd
|
||||
, to_char(send_dt, 'yyyymmddhh24miss')
|
||||
, ''
|
||||
, ''
|
||||
, 'KKO-MY-DOC'
|
||||
, ''
|
||||
, ''
|
||||
, '1'
|
||||
, to_char(close_dt, 'yyyymmddhh24miss')
|
||||
, ''
|
||||
, ''
|
||||
, regist_dt
|
||||
, 'system'
|
||||
, last_updt_dt
|
||||
, 'system'
|
||||
from ens_snd_mast a
|
||||
where stat_cd IN ('open', 'sendcmplt')
|
||||
and tmplt_cd like '%2';
|
||||
|
||||
|
||||
insert into tb_ens_unity_sndng_mastr
|
||||
select (select c.elctrn_ntic_sndng_id from ens_snd_dtl_kt_gbs b inner join tb_elctrn_ntic_sndng_detail c on b.LINKED_UUID=c.external_document_uuid where a.send_mast_id = b.send_mast_id and rownum = 1)
|
||||
, org_cd
|
||||
, '11'
|
||||
, tmplt_cd
|
||||
, 'ENS'
|
||||
, send_cnt
|
||||
, 'send_ok' -- stat_cd
|
||||
, to_char(send_dt, 'yyyymmddhh24miss')
|
||||
, ''
|
||||
, ''
|
||||
, 'KT-GBS'
|
||||
, ''
|
||||
, ''
|
||||
, '1'
|
||||
, to_char(close_dt, 'yyyymmddhh24miss')
|
||||
, ''
|
||||
, ''
|
||||
, regist_dt
|
||||
, 'system'
|
||||
, last_updt_dt
|
||||
, 'system'
|
||||
from ens_snd_mast a
|
||||
where stat_cd IN ('open', 'sendcmplt')
|
||||
and tmplt_cd like '%3';
|
||||
|
||||
|
||||
insert into tb_ens_unity_sndng_detail
|
||||
select (select b.elctrn_ntic_sndng_detail_id from tb_elctrn_ntic_sndng_detail b where a.prop_external_document_uuid=b.external_document_uuid)
|
||||
, (select c.elctrn_ntic_sndng_id from ens_snd_dtl_kko_md b inner join tb_elctrn_ntic_sndng_detail c on b.prop_external_document_uuid=c.external_document_uuid where a.send_mast_id = b.send_mast_id and rownum= 1)
|
||||
, bb.org_cd
|
||||
, '11'
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, (select mobile_page_cn from tb_ens_mobile_page_manage c where c.sndng_detail_id=concat('KKO', a.send_detail_id))
|
||||
, ''
|
||||
, a.prop_external_document_uuid
|
||||
, a.regist_dt
|
||||
, 'system'
|
||||
, a.last_updt_dt
|
||||
, 'system'
|
||||
from ens_snd_dtl_kko_md a
|
||||
inner join ens_snd_mast bb on (a.SEND_MAST_ID=bb.send_mast_id)
|
||||
where bb.stat_cd IN ('open', 'sendcmplt') and bb.tmplt_cd like '%2';
|
||||
|
||||
|
||||
insert into tb_ens_unity_sndng_detail
|
||||
select (select b.elctrn_ntic_sndng_detail_id from tb_elctrn_ntic_sndng_detail b where a.LINKED_UUID=b.external_document_uuid)
|
||||
, (select c.elctrn_ntic_sndng_id from ens_snd_dtl_kt_gbs b inner join tb_elctrn_ntic_sndng_detail c on b.LINKED_UUID=c.external_document_uuid where a.send_mast_id = b.send_mast_id and rownum= 1)
|
||||
, bb.org_cd
|
||||
, '11'
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, (select mobile_page_cn from tb_ens_mobile_page_manage c where c.sndng_detail_id=concat('KTG', a.send_detail_id))
|
||||
, ''
|
||||
, a.LINKED_UUID
|
||||
, null
|
||||
, 'system'
|
||||
, null
|
||||
, 'system'
|
||||
from ens_snd_dtl_kt_gbs a
|
||||
inner join ens_snd_mast bb on (a.SEND_MAST_ID=bb.send_mast_id)
|
||||
where bb.stat_cd IN ('open', 'sendcmplt') and bb.tmplt_cd like '%3';
|
||||
|
||||
|
||||
|
||||
insert into tb_ens_sndng_mastr
|
||||
select concat('KKO', send_mast_id)
|
||||
, (select c.elctrn_ntic_sndng_id from ens_snd_dtl_kko_md b inner join tb_elctrn_ntic_sndng_detail c on b.prop_external_document_uuid=c.external_document_uuid where a.send_mast_id = b.send_mast_id and rownum=1)
|
||||
, org_cd
|
||||
, '11'
|
||||
, tmplt_cd
|
||||
, 'ENS'
|
||||
, 'KKO-MY-DOC'
|
||||
, send_cnt
|
||||
, '1'
|
||||
, '1'
|
||||
, 'send_ok'
|
||||
, to_char(send_dt, 'yyyymmddhh24miss')
|
||||
, to_char(close_dt, 'yyyymmddhh24miss')
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, null
|
||||
, ''
|
||||
, regist_dt
|
||||
, 'system'
|
||||
, last_updt_dt
|
||||
, 'system'
|
||||
from ens_snd_mast a
|
||||
where stat_cd IN ('open', 'sendcmplt')
|
||||
and tmplt_cd like '%2';
|
||||
|
||||
|
||||
insert into tb_ens_sndng_mastr
|
||||
select concat('KTG', send_mast_id)
|
||||
, (select c.elctrn_ntic_sndng_id from ens_snd_dtl_kt_gbs b inner join tb_elctrn_ntic_sndng_detail c on b.LINKED_UUID=c.external_document_uuid where a.send_mast_id = b.send_mast_id and rownum=1)
|
||||
, org_cd
|
||||
, '11'
|
||||
, tmplt_cd
|
||||
, 'ENS'
|
||||
, 'KT-GBS'
|
||||
, send_cnt
|
||||
, '1'
|
||||
, '1'
|
||||
, 'send_ok'
|
||||
, to_char(send_dt, 'yyyymmddhh24miss')
|
||||
, to_char(close_dt, 'yyyymmddhh24miss')
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, null
|
||||
, ''
|
||||
, regist_dt
|
||||
, 'system'
|
||||
, last_updt_dt
|
||||
, 'system'
|
||||
from ens_snd_mast a
|
||||
where stat_cd IN ('open', 'sendcmplt')
|
||||
and tmplt_cd like '%3';
|
||||
|
||||
|
||||
insert into tb_ens_kakao_my_doc
|
||||
select concat('KKO', a.send_detail_id)
|
||||
, (select b.elctrn_ntic_sndng_detail_id from tb_elctrn_ntic_sndng_detail b where a.prop_external_document_uuid=b.external_document_uuid)
|
||||
, concat('KKO', a.send_mast_id)
|
||||
, bb.org_cd
|
||||
, '11'
|
||||
, a.title
|
||||
, a.hash
|
||||
, a.common_categories
|
||||
, a.read_expiread_at
|
||||
, a.recv_ci
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, a.recv_is_require_vfy_name
|
||||
, a.prop_link
|
||||
, a.prop_payload
|
||||
, a.prop_message
|
||||
, a.prop_cs_number
|
||||
, a.prop_cs_name
|
||||
, a.prop_external_document_uuid
|
||||
, a.document_binder_uuid
|
||||
, a.error_code
|
||||
, a.error_message
|
||||
, a.kko_doc_stat
|
||||
, FN_GET_DATETOUNIXTIME(a.kko_doc_sent_dt)
|
||||
, FN_GET_DATETOUNIXTIME(a.kko_doc_received_dt)
|
||||
, FN_GET_DATETOUNIXTIME(a.kko_doc_auth_frst_dt)
|
||||
, FN_GET_DATETOUNIXTIME(a.kko_doc_token_vrfy_frst_dt)
|
||||
, FN_GET_DATETOUNIXTIME(a.kko_doc_read_frst_dt)
|
||||
, FN_GET_DATETOUNIXTIME(a.kko_doc_user_notied_dt)
|
||||
, a.regist_dt
|
||||
, 'system'
|
||||
, a.last_updt_dt
|
||||
, 'system'
|
||||
from ens_snd_dtl_kko_md a
|
||||
inner join ens_snd_mast bb on (a.SEND_MAST_ID=bb.send_mast_id)
|
||||
where bb.stat_cd IN ('open', 'sendcmplt') and bb.tmplt_cd like '%2';
|
||||
|
||||
|
||||
insert into tb_ens_kt_gbs
|
||||
select concat('KTG', b.SEND_MAST_ID)
|
||||
, concat('KTG', b.send_detail_id)
|
||||
, (select bb.elctrn_ntic_sndng_detail_id from tb_elctrn_ntic_sndng_detail bb where b.LINKED_UUID=bb.external_document_uuid)
|
||||
, E.ORG_CD
|
||||
, '11'
|
||||
, E.KT_ST_SERVICE_CD
|
||||
, ''
|
||||
, ''
|
||||
, A.SEND_CNT
|
||||
, TO_CHAR(A.CLOSE_DT, 'YYYYMMDDHH24MISS')
|
||||
, TO_CHAR(A.CLOSE_DT, 'YYYYMMDDHH24MISS')
|
||||
, ''
|
||||
, D.M_TYPE
|
||||
, D.MSG_TYPE
|
||||
, D.OPT_TYPE
|
||||
, B.SRC_KEY
|
||||
, B.SRC_SEQ
|
||||
, B.CI
|
||||
, B.MMS_DTL_CNTS
|
||||
, B.MMS_TITLE
|
||||
, ''
|
||||
, B.URL
|
||||
, B.HASH
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, B.DOC_STAT
|
||||
, B.DOC_SENT_DT
|
||||
, B.DOC_RECEIVED_DT
|
||||
, B.DOC_READ_FRST_DT
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
, sysdate
|
||||
, ''
|
||||
, ''
|
||||
, ''
|
||||
FROM ENS_SND_MAST A
|
||||
INNER JOIN ENS_SND_DTL_KT_GBS B ON (A.SEND_MAST_ID=B.SEND_MAST_ID)
|
||||
INNER JOIN ENS_TMPLT_MNG C ON (A.TMPLT_CD=C.TMPLT_CD)
|
||||
INNER JOIN ENS_TMPLT_MNG_KT_GBS D ON (A.TMPLT_CD=D.TMPLT_CD)
|
||||
INNER JOIN ENS_ORG_MNG E ON (A.ORG_CD=E.ORG_CD)
|
||||
where a.STAT_CD in ('open', 'sendcmplt');
|
||||
|
@ -1,107 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/SETTINGS/1.0.0">
|
||||
<localRepository>C:/repo</localRepository>
|
||||
<servers>
|
||||
<server>
|
||||
<id>nexus</id>
|
||||
<username>xituser</username>
|
||||
<password>5811807</password>
|
||||
</server>
|
||||
<server>
|
||||
<id>maven-snapshots</id>
|
||||
<username>xituser</username>
|
||||
<password>5811807</password>
|
||||
</server>
|
||||
<server>
|
||||
<id>maven-releases</id>
|
||||
<username>xituser</username>
|
||||
<password>5811807</password>
|
||||
</server>
|
||||
<server>
|
||||
<id>maven-public</id>
|
||||
<username>xituser</username>
|
||||
<password>5811807</password>
|
||||
</server>
|
||||
</servers>
|
||||
|
||||
<mirrors>
|
||||
<mirror>
|
||||
<id>nexus</id>
|
||||
<mirrorOf>nexus</mirrorOf>
|
||||
<url>https://nas.xit.co.kr:8888</url>
|
||||
</mirror>
|
||||
<mirror>
|
||||
<id>maven-snapshots</id>
|
||||
<mirrorOf>maven-snapshots</mirrorOf>
|
||||
<url>https://nas.xit.co.kr:8888/repository/maven-snapshots/</url>
|
||||
</mirror>
|
||||
<mirror>
|
||||
<id>maven-releases</id>
|
||||
<mirrorOf>maven-releases</mirrorOf>
|
||||
<url>https://nas.xit.co.kr:8888/repository/maven-releases/</url>
|
||||
</mirror>
|
||||
<mirror>
|
||||
<id>maven-public</id>
|
||||
<mirrorOf>maven-public</mirrorOf>
|
||||
<url>https://nas.xit.co.kr:8888/repository/maven-public/</url>
|
||||
</mirror>
|
||||
|
||||
<!-- http nexus 접근 허용이 필요한 경우 -->
|
||||
<mirror>
|
||||
<id>maven-default-http-blocker</id>
|
||||
<mirrorOf>external:dont-match-anything-mate:*</mirrorOf>
|
||||
<name>Pseudo repository to mirror external repositories initially using HTTP</name>
|
||||
<url>http://0.0.0.0/</url>
|
||||
</mirror>
|
||||
</mirrors>
|
||||
|
||||
<profiles>
|
||||
|
||||
<profile>
|
||||
<id>nexus</id>
|
||||
<repositories>
|
||||
|
||||
</repositories>
|
||||
<pluginRepositories>
|
||||
<pluginRepository>
|
||||
<id>maven-snapshots</id>
|
||||
<url>https://nas.xit.co.kr:8888/repository/maven-snapshots/</url>
|
||||
<releases>
|
||||
<enabled>false</enabled>
|
||||
</releases>
|
||||
<snapshots>
|
||||
<enabled>true</enabled>
|
||||
</snapshots>
|
||||
</pluginRepository>
|
||||
<pluginRepository>
|
||||
<id>maven-releases</id>
|
||||
<url>https://nas.xit.co.kr:8888/repository/maven-releases/</url>
|
||||
<releases>
|
||||
<enabled>true</enabled>
|
||||
</releases>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
</pluginRepository>
|
||||
<pluginRepository>
|
||||
<id>maven-public</id>
|
||||
<url>https://nas.xit.co.kr:8888/repository/maven-public/</url>
|
||||
<releases>
|
||||
<enabled>true</enabled>
|
||||
</releases>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
</pluginRepository>
|
||||
</pluginRepositories>
|
||||
</profile>
|
||||
|
||||
</profiles>
|
||||
|
||||
<activeProfiles>
|
||||
<activeProfile>nexus</activeProfile>
|
||||
</activeProfiles>
|
||||
|
||||
</settings>
|
Binary file not shown.
Before Width: | Height: | Size: 40 KiB |
Binary file not shown.
Before Width: | Height: | Size: 11 KiB |
@ -1,28 +0,0 @@
|
||||
package kr.xit.biz.ktgbs.mapper;
|
||||
|
||||
import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
|
||||
|
||||
import kr.xit.biz.ens.model.cmm.CmmEnsRlaybsnmDTO;
|
||||
import kr.xit.biz.ens.model.ktgbs.KtGbsDTO;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
*
|
||||
* packageName : kr.xit.biz.ktgbs.mapper
|
||||
* fileName : IBizKtGbsMapper
|
||||
* author : limju
|
||||
* date : 2024-08-19
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024-08-19 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Mapper
|
||||
public interface IBizKtGbsMapper {
|
||||
void updateRlaybsnmKtGbsInfo(final CmmEnsRlaybsnmDTO dto);
|
||||
int updateKtGbsDtl(final KtGbsDTO.MsgRsltReqsData dto);
|
||||
void saveKtGbsCntcSndngResult(final KtGbsDTO.MsgRsltReqsData dto);
|
||||
}
|
@ -1,149 +0,0 @@
|
||||
package kr.xit.biz.ktgbs.service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import kr.xit.biz.cmm.service.ICmmEnsCacheService;
|
||||
import kr.xit.biz.common.ApiConstants;
|
||||
import kr.xit.biz.ens.model.cmm.CmmEnsRequestDTO;
|
||||
import kr.xit.biz.ens.model.cmm.CmmEnsRlaybsnmDTO;
|
||||
import kr.xit.biz.ens.model.kt.KtCommonDTO;
|
||||
import kr.xit.biz.ens.model.kt.KtCommonDTO.ErrorMsg;
|
||||
import kr.xit.biz.ens.model.ktgbs.KtGbsDTO;
|
||||
import kr.xit.biz.ktgbs.mapper.IBizKtGbsMapper;
|
||||
import kr.xit.core.exception.BizRuntimeException;
|
||||
import kr.xit.core.service.AbstractService;
|
||||
import kr.xit.core.spring.annotation.TraceLogging;
|
||||
import kr.xit.core.support.utils.Checks;
|
||||
import kr.xit.core.support.utils.DateUtils;
|
||||
import kr.xit.ens.cmm.CmmEnsUtils;
|
||||
import kr.xit.ens.kt.web.KtBcInboundController;
|
||||
import kr.xit.ens.ktgbs.service.IKtGbsService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
*
|
||||
* packageName : kr.xit.biz.ktgbs.service
|
||||
* fileName : BizKtGbsService
|
||||
* author : limju
|
||||
* date : 2024-08-19
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024-08-19 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class BizKtGbsService extends AbstractService implements IBizKtGbsService {
|
||||
private final IKtGbsService ktGbsService;
|
||||
private final ICmmEnsCacheService cacheService;
|
||||
private final IBizKtGbsMapper mapper;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* kt Access token 획득
|
||||
* 1. kt Access token 요청
|
||||
* 2. 요청결과 DB 반영
|
||||
* 3. 정보중계자 정보 캐시 삭제
|
||||
* @param paramDTO KtMnsRequest
|
||||
* @return KtTokenResponse
|
||||
* </pre>
|
||||
*/
|
||||
@Override
|
||||
public KtGbsDTO.TokenResponse requestToken(final KtCommonDTO.KtMnsRequest paramDTO) {
|
||||
KtGbsDTO.TokenResponse resDTO = ktGbsService.requestToken(paramDTO);
|
||||
|
||||
if(StringUtils.isEmpty(resDTO.getAccessToken())){
|
||||
throw BizRuntimeException.create("fail.api.kt.token.request");
|
||||
}
|
||||
|
||||
mapper.updateRlaybsnmKtGbsInfo(
|
||||
CmmEnsRlaybsnmDTO.builder()
|
||||
.signguCode(paramDTO.getSignguCode())
|
||||
.ffnlgCode(paramDTO.getFfnlgCode())
|
||||
.profile(paramDTO.getProfile())
|
||||
.ktAccessToken(resDTO.getAccessToken())
|
||||
.build()
|
||||
);
|
||||
cacheService.removeRlaybsnmInfoCache(
|
||||
CmmEnsRequestDTO.builder()
|
||||
.signguCode(paramDTO.getSignguCode())
|
||||
.ffnlgCode(paramDTO.getFfnlgCode())
|
||||
.profile(paramDTO.getProfile())
|
||||
.build()
|
||||
);
|
||||
return resDTO;
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 사전/본 문자 발송/수신 결과 전송
|
||||
* - KT 에서 호출 되는 서비스
|
||||
* - http://{각대행사(IP:Port)}/api/ag/message/result
|
||||
* {@link KtBcInboundController#messageResult messageResult}
|
||||
*
|
||||
* 본문자 수신 등록 요청시 보낸 묶음 단위로 처리
|
||||
* -> 처리중 1건이라도 실패시, 전체 건 재 전송
|
||||
* -> 업무단에서는 건별 처리하도록 구현
|
||||
*
|
||||
* @param reqDTO KtMsgRsltRequest
|
||||
* @return KtCommonResponse
|
||||
* </pre>
|
||||
*/
|
||||
@Override
|
||||
@TraceLogging
|
||||
@Transactional
|
||||
public KtCommonDTO.KtCommonResponse messageResult(final KtGbsDTO.MsgRsltRequest reqDTO) {
|
||||
List<ErrorMsg> errors = CmmEnsUtils.getValidateErrors(reqDTO);
|
||||
|
||||
if(!errors.isEmpty()) return throwError(errors);
|
||||
|
||||
for(KtGbsDTO.MsgRsltReqsData dto : reqDTO.getReqs()){
|
||||
|
||||
// 결과코드가 '40' 이고 열람타임스탬프가 있는 경우 -> 결과코드 '열람확인:60'으로 reset
|
||||
if("40".equals(dto.getMmsRsltDvcd()) && Checks.isNotEmpty(dto.getMmsRdgTmst())){
|
||||
dto.setMmsRsltDvcd("60");
|
||||
}
|
||||
dto.setMmsRsltDvcdMsg(messageUtil.getMessage("info.api.kt.msg.rslt."+dto.getMmsRsltDvcd()));
|
||||
if(mapper.updateKtGbsDtl(dto) != 1) {
|
||||
errors.add(new ErrorMsg(
|
||||
String.format("존재 하지 않는 발송 대상(src_key[%s], mms_rslt_sqno[%s]) 입니다",
|
||||
dto.getSrcKey(), dto.getMmsSndgRsltSqno())));
|
||||
}
|
||||
|
||||
// 업무 테이블에 발송 결과 상태 적용
|
||||
if (("40").equals(dto.getMmsRsltDvcd())) {
|
||||
dto.setMmsRsltDvcd("RECEIVED");
|
||||
} else if (("60").equals(dto.getMmsRsltDvcd())) {
|
||||
dto.setMmsRsltDvcd("READ");
|
||||
} else if (("4N").equals(dto.getMmsRsltDvcd())) {
|
||||
dto.setMmsRsltDvcd("FORBIDDEN");
|
||||
} else if (("4T").equals(dto.getMmsRsltDvcd())) {
|
||||
dto.setMmsRsltDvcd("UNIDENTIFIED_USER");
|
||||
} else {
|
||||
dto.setMmsRsltDvcd("FAIL");
|
||||
}
|
||||
mapper.saveKtGbsCntcSndngResult(dto);
|
||||
}
|
||||
|
||||
return KtCommonDTO.KtCommonResponse.builder()
|
||||
.resultCd("00")
|
||||
.resultDt(DateUtils.getTodayAndNowTime(ApiConstants.FMT_DT_EMPTY_DLT))
|
||||
.build();
|
||||
}
|
||||
|
||||
private static KtCommonDTO.KtCommonResponse throwError(List<ErrorMsg> errors) {
|
||||
return KtCommonDTO.KtCommonResponse.builder()
|
||||
.resultCd("01")
|
||||
.resultDt(DateUtils.getTodayAndNowTime(ApiConstants.FMT_DT_EMPTY_DLT))
|
||||
.errors(errors)
|
||||
.build();
|
||||
}
|
||||
}
|
@ -1,26 +0,0 @@
|
||||
package kr.xit.biz.ktgbs.service;
|
||||
|
||||
|
||||
import kr.xit.biz.ens.model.kt.KtCommonDTO;
|
||||
import kr.xit.biz.ens.model.ktgbs.KtGbsDTO;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
*
|
||||
* packageName : kr.xit.biz.ktgbs.service
|
||||
* fileName : IBizKtGbsService
|
||||
* author : limju
|
||||
* date : 2024-08-19
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024-08-19 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
public interface IBizKtGbsService {
|
||||
|
||||
KtGbsDTO.TokenResponse requestToken(final KtCommonDTO.KtMnsRequest paramDTO);
|
||||
KtCommonDTO.KtCommonResponse messageResult(final KtGbsDTO.MsgRsltRequest reqDTO);
|
||||
}
|
@ -1,75 +0,0 @@
|
||||
package kr.xit.biz.ktgbs.web;
|
||||
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.media.Content;
|
||||
import io.swagger.v3.oas.annotations.media.ExampleObject;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import kr.xit.biz.ens.model.kt.KtCommonDTO.KtMnsRequest;
|
||||
import kr.xit.biz.ktgbs.service.IBizKtGbsService;
|
||||
import kr.xit.core.model.ApiResponseDTO;
|
||||
import kr.xit.core.model.IApiResponse;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
*
|
||||
* packageName : kr.xit.biz.ktgbs.web
|
||||
* fileName : BizKtGbsController
|
||||
* author : limju
|
||||
* date : 2024-08-19
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024-08-19 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Tag(name = "BizKtGbsController", description = "KT GIBIS 업무처리 Controller")
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping(value = "/api/biz/ktgbs/v1")
|
||||
@Slf4j
|
||||
public class BizKtGbsController {
|
||||
private static final String PARAM1 = """
|
||||
{
|
||||
"signguCode": "44131",
|
||||
"ffnlgCode": "11",
|
||||
"profile": "local"
|
||||
}
|
||||
""";
|
||||
private static final String PARAM2 = """
|
||||
{
|
||||
"signguCode": "44133",
|
||||
"ffnlgCode": "11",
|
||||
"profile": "local"
|
||||
}
|
||||
""";
|
||||
|
||||
private final IBizKtGbsService service;
|
||||
|
||||
@io.swagger.v3.oas.annotations.parameters.RequestBody(required = true, content = {
|
||||
@Content(
|
||||
mediaType = "application/json",
|
||||
examples = {
|
||||
@ExampleObject(
|
||||
name = "천안시동남구청",
|
||||
value = PARAM1),
|
||||
@ExampleObject(
|
||||
name = "천안시서북구청",
|
||||
value = PARAM2)
|
||||
})
|
||||
})
|
||||
@Operation(deprecated = true, summary = "기관용 토큰 발급 요청-batch에서 호출", description = "기관용 토큰 발급 요청-batch에서 호출")
|
||||
@PostMapping(value = "/requestToken", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public IApiResponse requestToken(@RequestBody final KtMnsRequest paramDTO) {
|
||||
return ApiResponseDTO.success(service.requestToken(paramDTO));
|
||||
}
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
package kr.xit.biz.mbl.web;
|
||||
|
||||
import org.springframework.boot.web.servlet.error.ErrorController;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
|
||||
@Controller
|
||||
public class CustomErrorController implements ErrorController {
|
||||
|
||||
@RequestMapping("/error")
|
||||
public ModelAndView handleError() {
|
||||
// 에러 페이지로 이동
|
||||
return new ModelAndView("/error");
|
||||
}
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
package kr.xit.biz.other.mapper;
|
||||
|
||||
import kr.xit.biz.other.model.ElecnoticeDTO;
|
||||
import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description : 전자고지 파일 외부연계 mapper
|
||||
*
|
||||
* packageName : kr.xit.biz.other.mapper
|
||||
* fileName : IBizOtherMapper
|
||||
* author : seojh
|
||||
* date : 2024-01-03
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024-01-03 seojh 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Mapper
|
||||
public interface IBizOtherMapper {
|
||||
|
||||
List<ElecnoticeDTO.Elecnoticemst> selectElecnoticemst();
|
||||
}
|
@ -0,0 +1,122 @@
|
||||
package kr.xit.biz.other.model;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.SuperBuilder;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description : 전자고지 파일 외부연계 DTO
|
||||
*
|
||||
* packageName : kr.xit.biz.other.model
|
||||
* fileName : ElecnoticeDTO
|
||||
* author : seojh
|
||||
* date : 2024-01-03
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024-01-03 seojh 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
public class ElecnoticeDTO {
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@SuperBuilder
|
||||
public static class Elecnoticemst {
|
||||
|
||||
/**
|
||||
* 파일 일련번호
|
||||
*/
|
||||
private String unitysndngmastrid;
|
||||
/**
|
||||
* 우편물 발송건수
|
||||
*/
|
||||
private String sndngco;
|
||||
/**
|
||||
* 발송처리상태
|
||||
*/
|
||||
private String sndngprocesssttus;
|
||||
/**
|
||||
* 등록자
|
||||
*/
|
||||
private String insuser;
|
||||
/**
|
||||
* 등록일자
|
||||
*/
|
||||
private String insdate;
|
||||
/**
|
||||
* 수정자
|
||||
*/
|
||||
private String upduser;
|
||||
/**
|
||||
* 수정일자
|
||||
*/
|
||||
private String upddate;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@SuperBuilder
|
||||
public static class Elecnoticedtl extends Elecnoticemst {
|
||||
/**
|
||||
* 우편물 일련번호
|
||||
*/
|
||||
private String unitysndngdetailid;
|
||||
/**
|
||||
* 우편물 요청일시
|
||||
*/
|
||||
private String sndngdt;
|
||||
/**
|
||||
* 우편물 발송구분
|
||||
*/
|
||||
private String tmplatid;
|
||||
/**
|
||||
* 고지차수
|
||||
*/
|
||||
private String gojidepth;
|
||||
/**
|
||||
* 기관번호
|
||||
*/
|
||||
private String taxnum1;
|
||||
/**
|
||||
* 세목
|
||||
*/
|
||||
private String taxnum2;
|
||||
/**
|
||||
* 납세년월기
|
||||
*/
|
||||
private String taxnum3;
|
||||
/**
|
||||
* 과세번호
|
||||
*/
|
||||
private String taxnum4;
|
||||
/**
|
||||
* 담당자
|
||||
*/
|
||||
private String worker;
|
||||
/**
|
||||
* 가상계좌 일련번호
|
||||
*/
|
||||
private String serialno;
|
||||
/**
|
||||
* 수신일자
|
||||
*/
|
||||
private String recvdt;
|
||||
/**
|
||||
* 열람일자
|
||||
*/
|
||||
private String readdt;
|
||||
/**
|
||||
* 발송결과코드
|
||||
*/
|
||||
private String resultcode;
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
package kr.xit.biz.sisul.mapper;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import kr.xit.biz.ens.model.cmm.CmmEnsFileInfDTO;
|
||||
import kr.xit.biz.ens.model.cmm.TmplatManage;
|
||||
import kr.xit.biz.ens.model.cntc.CntcDTO;
|
||||
import kr.xit.biz.sisul.model.SisulSndngResultDTO.RsltSisulRequest;
|
||||
import kr.xit.biz.sisul.model.SisulSndngResultDTO.RsltSisulResDtlData;
|
||||
import kr.xit.biz.sisul.model.SisulSndngResultDTO.RsltSisulResMstData;
|
||||
import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description : 전자고지 File mapper
|
||||
*
|
||||
* packageName : kr.xit.biz.sisul.mapper
|
||||
* fileName : IBizSisulMapper
|
||||
* author : seojh
|
||||
* date : 2023-10-19
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2023-10-19 seojh 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Mapper
|
||||
public interface IBizSisulMapper {
|
||||
Optional<TmplatManage> selectDeptInfoByTmplId(final String tmplatId);
|
||||
int insertCntcSndngMst(CntcDTO.SndngMst dto);
|
||||
int insertCntcSndngDtl(CntcDTO.SndngDtl dto);
|
||||
int insertCi(CmmEnsFileInfDTO.FmcInfExcelRslt dto);
|
||||
int insertPostPlusJson(CntcDTO.PostPlusJson dto);
|
||||
|
||||
Optional<RsltSisulResMstData> selectSndngResultMaster(final RsltSisulRequest dto);
|
||||
List<RsltSisulResDtlData> selectSndngResultDetails(final RsltSisulRequest dto);
|
||||
}
|
@ -0,0 +1,146 @@
|
||||
package kr.xit.biz.sisul.model;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
|
||||
import javax.validation.constraints.Size;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
*
|
||||
* packageName : kr.xit.biz.sisul.model
|
||||
* fileName : SisulSndngResultDTO
|
||||
* author : limju
|
||||
* date : 2023-11-02
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2023-11-02 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
public class SisulSndngResultDTO {
|
||||
|
||||
@Schema(name = "RsltSisulRequest", description = "발송결과정보 조회 request DTO")
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
public static class RsltSisulRequest {
|
||||
/**
|
||||
* 통합발송마스터 ID - 파일유일키
|
||||
*/
|
||||
@Schema(requiredMode = RequiredMode.REQUIRED, title = "파일유일키", example = "DPMKK271000000777777")
|
||||
@Size(min = 1, max = 20, message = "파일유일키는 필수 입니다(max:20)")
|
||||
private String unitySndngMastrId;
|
||||
|
||||
/**
|
||||
* 통합발송상세 ID - 우편물 일련 번호
|
||||
*/
|
||||
@Schema(requiredMode = RequiredMode.AUTO, title = "우편물 일련번호", example = " ")
|
||||
@Size(max = 20, message = "우편물 일련번호는 20자를 넘을 수 없습니다.")
|
||||
private String unitySndngDetailId;
|
||||
}
|
||||
|
||||
@Schema(name = "RsltSisulResMstData", description = "발송결과정보 master 조회 response DTO")
|
||||
@Getter
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
public static class RsltSisulResMstData {
|
||||
|
||||
/**
|
||||
* 통합발송마스터 ID - 파일유일키
|
||||
*/
|
||||
private String unitySndngMastrId;
|
||||
|
||||
/**
|
||||
* 발송구분코드 - KKO-MY-DOC|KT-BC|POST-PLUS
|
||||
*/
|
||||
private String sndngSeCode;
|
||||
|
||||
/**
|
||||
* 템플릿ID
|
||||
*/
|
||||
private String tmplatId;
|
||||
|
||||
/**
|
||||
* 발송건수
|
||||
*/
|
||||
private Integer sndngCo;
|
||||
|
||||
/**
|
||||
* 발송처리 상태
|
||||
*/
|
||||
private String sndngProcessSttus;
|
||||
|
||||
/**
|
||||
* 발송일시 : yyyyMMddHHmiss
|
||||
*/
|
||||
private String sndngDt;
|
||||
}
|
||||
|
||||
@Schema(name = "RsltSisulResDtlData", description = "발송결과정보 details 조회 response DTO")
|
||||
@Getter
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
public static class RsltSisulResDtlData {
|
||||
/**
|
||||
* 통합발송마스터 ID - 파일유일키
|
||||
*/
|
||||
private String unitySndngMastrId;
|
||||
|
||||
/**
|
||||
* 통합발송상세 ID - 우편물 일련 번호
|
||||
*/
|
||||
private String unitySndngDetailId;
|
||||
|
||||
/**
|
||||
* 발송구분코드 - KKO-MY-DOC|KT-BC|POST-PLUS
|
||||
*/
|
||||
private String sndngSeCode;
|
||||
|
||||
/**
|
||||
* 템플릿ID
|
||||
*/
|
||||
private String tmplatId;
|
||||
|
||||
/**
|
||||
* 발송일시 : yyyyMMddHHmiss
|
||||
*/
|
||||
@JsonProperty("sndngDt")
|
||||
private String requstDt;
|
||||
|
||||
/**
|
||||
* 수신일시 : yyyyMMddHHmiss
|
||||
* recvDt 로 전송
|
||||
*/
|
||||
@JsonProperty("recvDt")
|
||||
private String inqireDt;
|
||||
|
||||
/**
|
||||
* 열람일시 : yyyyMMddHHmiss
|
||||
* readDt 로 전송
|
||||
*/
|
||||
@JsonProperty("readDt")
|
||||
private String readngDt;
|
||||
|
||||
/**
|
||||
* 등기번호
|
||||
*/
|
||||
private String rgistno;
|
||||
|
||||
/**
|
||||
* 발송결과 상태 - resultCode 로 전송
|
||||
*/
|
||||
@JsonProperty("resultCode")
|
||||
private String sndngResultSttus;
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,30 @@
|
||||
package kr.xit.biz.sisul.service;
|
||||
|
||||
import java.util.List;
|
||||
import kr.xit.biz.ens.model.cmm.CmmEnsFileInfDTO.FmcExcelUpload;
|
||||
import kr.xit.biz.sisul.model.SisulSndngResultDTO.RsltSisulRequest;
|
||||
import kr.xit.biz.sisul.model.SisulSndngResultDTO.RsltSisulResDtlData;
|
||||
import kr.xit.biz.sisul.model.SisulSndngResultDTO.RsltSisulResMstData;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
*
|
||||
* packageName : kr.xit.biz.sisul.service
|
||||
* fileName : IBizSisulService
|
||||
* author : limju
|
||||
* date : 2023-09-05
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2023-09-05 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
public interface IBizSisulService {
|
||||
|
||||
String fmcExcelUpload(final FmcExcelUpload fileReq);
|
||||
|
||||
RsltSisulResMstData findSndngResultMaster(final RsltSisulRequest dto);
|
||||
List<RsltSisulResDtlData> findSndngResultDetails(final RsltSisulRequest dto);
|
||||
}
|
@ -0,0 +1,66 @@
|
||||
package kr.xit.biz.sisul.web;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import kr.xit.biz.ens.model.cmm.CmmEnsFileInfDTO.FmcExcelUpload;
|
||||
import kr.xit.biz.sisul.model.SisulSndngResultDTO.RsltSisulRequest;
|
||||
import kr.xit.biz.sisul.service.IBizSisulService;
|
||||
import kr.xit.core.model.ApiResponseDTO;
|
||||
import kr.xit.core.model.IApiResponse;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description : 전자고지 시설관리 시스템 연계 관련 처리
|
||||
*
|
||||
* packageName : kr.xit.biz.sisul.web
|
||||
* fileName : BizSisulController
|
||||
* author : limju
|
||||
* date : 2023-09-04
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2023-09-04 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Slf4j
|
||||
@Tag(name = "BizSisulController", description = "전자고지 시설관리 시스템 연계 관련 처리")
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping(value = "/api/biz/sisul/v1")
|
||||
public class BizSisulController {
|
||||
|
||||
private final IBizSisulService service;
|
||||
|
||||
/**
|
||||
* 시설관리공단(Facility Management Corporation) 전자고지 대상
|
||||
* @param fileReq
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "시설관리공단 전자고지 대상 엑셀업로드 처리", description = "시설관리공단 전자고지 대상 엑셀업로드 처리<br><a href='http://localhost:8082/fmcExcelUpload.html'>전자고지연계파일처리</a>")
|
||||
@PostMapping(value = "/fmcExcelUpload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public IApiResponse fmcExcelUpload(@ModelAttribute FmcExcelUpload fileReq) {
|
||||
String msg = service.fmcExcelUpload(fileReq);
|
||||
return ApiResponseDTO.success(fileReq, msg);
|
||||
}
|
||||
|
||||
@Operation(summary = "발송결과정보 마스터 조회 - 시설공단 내부시스템에서 호출", description = "발송결과정보 마스터 조회 - 시설공단 내부시스템에서 호출")
|
||||
@PostMapping(value = "/sndng/result/master", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public IApiResponse findSndngResultMaster(@RequestBody RsltSisulRequest reqDTO) {
|
||||
return ApiResponseDTO.success(service.findSndngResultMaster(reqDTO));
|
||||
}
|
||||
|
||||
@Operation(summary = "발송결과정보 상세 조회 - 시설공단 내부시스템에서 호출", description = "발송결과정보 상세 조회 - 시설공단 내부시스템에서 호출")
|
||||
@PostMapping(value = "/sndng/result/details", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public IApiResponse findSndngResultDetails(@RequestBody RsltSisulRequest reqDTO) {
|
||||
return ApiResponseDTO.success(service.findSndngResultDetails(reqDTO));
|
||||
}
|
||||
}
|
@ -1,67 +0,0 @@
|
||||
package kr.xit.core.spring.util;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonDeserializationContext;
|
||||
import com.google.gson.JsonDeserializer;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParseException;
|
||||
import com.google.gson.JsonPrimitive;
|
||||
|
||||
public class MapDeserailizer implements JsonDeserializer<Map<String, Object>> {
|
||||
|
||||
@Override @SuppressWarnings("unchecked")
|
||||
public Map<String, Object> deserialize(JsonElement json, Type typeOfT,
|
||||
JsonDeserializationContext context) throws JsonParseException {
|
||||
return (Map<String, Object>) read(json);
|
||||
}
|
||||
|
||||
public Object read(JsonElement in) {
|
||||
if(in.isJsonArray()){
|
||||
|
||||
List<Object> list = new ArrayList<Object>();
|
||||
JsonArray arr = in.getAsJsonArray();
|
||||
for (JsonElement anArr : arr) {
|
||||
|
||||
list.add(read(anArr));
|
||||
}
|
||||
return list;
|
||||
}else if(in.isJsonObject()){
|
||||
Map<String, Object> map = new HashMap<String, Object>();
|
||||
JsonObject obj = in.getAsJsonObject();
|
||||
Set<Map.Entry<String, JsonElement>> entitySet = obj.entrySet();
|
||||
for(Map.Entry<String, JsonElement> entry: entitySet){
|
||||
|
||||
map.put(entry.getKey(), read(entry.getValue()));
|
||||
}
|
||||
return map;
|
||||
}else if( in.isJsonPrimitive()){
|
||||
JsonPrimitive prim = in.getAsJsonPrimitive();
|
||||
if(prim.isBoolean()){
|
||||
|
||||
return prim.getAsBoolean();
|
||||
}else if(prim.isString()){
|
||||
|
||||
return prim.getAsString();
|
||||
}else if(prim.isNumber()){
|
||||
Number num = prim.getAsNumber();
|
||||
|
||||
if(Math.ceil(num.doubleValue()) == num.longValue())
|
||||
|
||||
return num.longValue();
|
||||
else{
|
||||
|
||||
return num.doubleValue();
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
@ -0,0 +1,70 @@
|
||||
package kr.xit.ens.epost.service;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import kr.xit.biz.common.ApiConstants.SndngSeCode;
|
||||
import kr.xit.biz.ens.model.cmm.CmmEnsRlaybsnmDTO;
|
||||
import kr.xit.biz.ens.model.epost.EPostDTO.EpostTraceRequest;
|
||||
import kr.xit.biz.ens.model.epost.EPostDTO.EpostTraceResponse;
|
||||
import kr.xit.core.service.AbstractService;
|
||||
import kr.xit.core.spring.annotation.TraceLogging;
|
||||
import kr.xit.core.spring.util.ApiWebClientUtil;
|
||||
import kr.xit.ens.cmm.CmmEnsUtils;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
*
|
||||
* packageName : kr.xit.ens.epost.service
|
||||
* fileName : EpostService
|
||||
* author : limju
|
||||
* date : 2023-10-04
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2023-10-04 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class EpostService extends AbstractService implements IEpostService {
|
||||
@Value("${app.contract.epost.host}")
|
||||
private String HOST;
|
||||
|
||||
@Value("${app.contract.epost.api.postTrackInfo}")
|
||||
private String POST_TRACK_INFO;
|
||||
|
||||
private final ApiWebClientUtil webClient;
|
||||
|
||||
@Override
|
||||
@TraceLogging
|
||||
public EpostTraceResponse postTrackInfo(final EpostTraceRequest reqDTO) {
|
||||
final CmmEnsRlaybsnmDTO ktMnsInfo = CmmEnsUtils.getRlaybsnmInfo(reqDTO.getSignguCode(), reqDTO.getFfnlgCode(),
|
||||
SndngSeCode.PPLUS);reqDTO.setServiceKey(ktMnsInfo.getEpostServiceKey());
|
||||
|
||||
final Map<String,String> headerMap = new HashMap<>();
|
||||
headerMap.put(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
|
||||
|
||||
reqDTO.setSignguCode(null);
|
||||
reqDTO.setFfnlgCode(null);
|
||||
reqDTO.setProfile(null);
|
||||
CmmEnsUtils.validate(reqDTO);
|
||||
|
||||
return webClient.exchange(
|
||||
HOST + POST_TRACK_INFO + String.format("?serviceKey=%s&rgist=%s",reqDTO.getServiceKey(), reqDTO.getRgist()),
|
||||
HttpMethod.GET,
|
||||
reqDTO,
|
||||
EpostTraceResponse.class,
|
||||
headerMap
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
package kr.xit.ens.epost.service;
|
||||
|
||||
import kr.xit.biz.ens.model.epost.EPostDTO.EpostTraceRequest;
|
||||
import kr.xit.biz.ens.model.epost.EPostDTO.EpostTraceResponse;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
*
|
||||
* packageName : kr.xit.ens.pplus.service
|
||||
* fileName : IPplusService
|
||||
* author : limju
|
||||
* date : 2023-10-04
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2023-10-04 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
public interface IEpostService {
|
||||
EpostTraceResponse postTrackInfo(final EpostTraceRequest reqDTO);
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
package kr.xit.ens.epost.web;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import kr.xit.biz.ens.model.epost.EPostDTO.EpostTraceRequest;
|
||||
import kr.xit.core.model.ApiResponseDTO;
|
||||
import kr.xit.core.model.IApiResponse;
|
||||
import kr.xit.ens.epost.service.IEpostService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
*
|
||||
* packageName : kr.xit.ens.epost.web
|
||||
* fileName : EpostController
|
||||
* author : limju
|
||||
* date : 2023-10-04
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2023-10-04 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Tag(name = "EpostController", description = "EPost API")
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/api/ens/epost/v1")
|
||||
public class EpostController {
|
||||
private final IEpostService service;
|
||||
|
||||
@Operation(summary = "우편물 종적추적", description = "우편물 종적 추적")
|
||||
@PostMapping(value = "/trace", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public IApiResponse postTrackInfo(@RequestBody final EpostTraceRequest paramDTO) {
|
||||
return ApiResponseDTO.success(service.postTrackInfo(paramDTO));
|
||||
}
|
||||
}
|
@ -1,178 +0,0 @@
|
||||
// package kr.xit.ens.kakao.v1.web;
|
||||
//
|
||||
// import org.springframework.http.MediaType;
|
||||
// import org.springframework.web.bind.annotation.PostMapping;
|
||||
// import org.springframework.web.bind.annotation.RequestBody;
|
||||
// import org.springframework.web.bind.annotation.RequestMapping;
|
||||
// import org.springframework.web.bind.annotation.RestController;
|
||||
//
|
||||
// import io.swagger.v3.oas.annotations.Operation;
|
||||
// import io.swagger.v3.oas.annotations.media.Content;
|
||||
// import io.swagger.v3.oas.annotations.media.ExampleObject;
|
||||
// import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
// import kr.xit.biz.ens.model.kakao.v1.KkopayDocAttrDTO;
|
||||
// import kr.xit.biz.ens.model.kakao.v1.KkopayDocBulkDTO;
|
||||
// import kr.xit.biz.ens.model.kakao.v1.KkopayDocDTO;
|
||||
// import kr.xit.core.model.ApiResponseDTO;
|
||||
// import kr.xit.core.model.IApiResponse;
|
||||
// import kr.xit.ens.kakao.v1.service.IAsyncKkopayEltrcDocService;
|
||||
// import lombok.RequiredArgsConstructor;
|
||||
// import lombok.extern.slf4j.Slf4j;
|
||||
//
|
||||
// /**
|
||||
// * <pre>
|
||||
// * description : 카카오 페이 전자 문서 발송 비동기용 controller
|
||||
// * packageName : kr.xit.ens.kakao.v1.web
|
||||
// * fileName : AsyncKkopayEltrcDocController
|
||||
// * author : julim
|
||||
// * date : 2023-04-28
|
||||
// * ======================================================================
|
||||
// * 변경일 변경자 변경 내용
|
||||
// * ----------------------------------------------------------------------
|
||||
// * 2023-04-28 julim 최초 생성
|
||||
// *
|
||||
// * </pre>
|
||||
// */
|
||||
// @Tag(name = "AsyncKkopayEltrcDocController", description = "카카오페이 MyDoc API(비동기)")
|
||||
// @Slf4j
|
||||
// @RequiredArgsConstructor
|
||||
// @RestController
|
||||
// @RequestMapping(value = "/api/ens/kakao/v2")
|
||||
// public class AsyncKkopayEltrcDocController {
|
||||
//
|
||||
// private final IAsyncKkopayEltrcDocService service;
|
||||
//
|
||||
// /**
|
||||
// * <pre>
|
||||
// * 모바일웹 연계 문서발송 요청
|
||||
// * -.이용기관 서버에서 전자문서 서버로 문서발송 처리를 요청합니다.
|
||||
// * </pre>
|
||||
// * @param reqDTO KkopayDocDTO.SendRequest
|
||||
// * @return ApiResponseDTO{@literal <KkopayDocDTO.SendResponse>}
|
||||
// */
|
||||
// @io.swagger.v3.oas.annotations.parameters.RequestBody(required = true, content = {
|
||||
// @Content(mediaType = "application/json", examples = {
|
||||
// @ExampleObject(value = """
|
||||
// {
|
||||
// "document": {
|
||||
// "title": "문서 제목",
|
||||
// "read_expired_sec": 3600,
|
||||
// "hash": "6EFE827AC88914DE471C621AE",
|
||||
// "common_categories": [
|
||||
// "NOTICE"
|
||||
// ],
|
||||
// "receiver": {
|
||||
// "phone_number": "01093414345",
|
||||
// "name": "김지호",
|
||||
// "birthday": "19831218",
|
||||
// "is_required_verify_name": false
|
||||
// },
|
||||
// "property": {
|
||||
// "link": "http://ip:8081/api/kakaopay/v1/ott",
|
||||
// "cs_number": "02-123-4567",
|
||||
// "cs_name": "콜센터",
|
||||
// "payload": "payload 파라미터 입니다.",
|
||||
// "message": "해당 안내문은 다음과 같습니다."
|
||||
// }
|
||||
// },
|
||||
// "signguCode": "88328",
|
||||
// "ffnlgCode": "11"
|
||||
// }
|
||||
// """)
|
||||
// })
|
||||
// })
|
||||
// @Operation(hidden = true, summary = "문서발송 요청", description = "카카오페이 전자문서 서버로 문서발송 처리를 요청")
|
||||
// @PostMapping(value = "/documents", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
// public IApiResponse requestSend(
|
||||
// @RequestBody final KkopayDocDTO.SendRequest reqDTO
|
||||
// ) {
|
||||
// return ApiResponseDTO.of(service.requestSend(reqDTO));
|
||||
// }
|
||||
//
|
||||
//
|
||||
// /**
|
||||
// * <pre>
|
||||
// * 토큰 유효성 검증(Redirect URL 접속 허용/불허)
|
||||
// * </pre>
|
||||
// * @param reqDTO KkopayDocDTO.ValidTokenRequest
|
||||
// * @return ApiResponseDTO<KkopayDocDTO.ValidTokenResponse>
|
||||
// */
|
||||
// @Operation(hidden = true, summary = "토큰 유효성 검증", description = "Redirect URL 접속 허용/불허")
|
||||
// @PostMapping(value = "/validToken", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
// public IApiResponse validToken(
|
||||
// @RequestBody final KkopayDocDTO.ValidTokenRequest reqDTO
|
||||
// ) {
|
||||
// return ApiResponseDTO.of(service.validToken(reqDTO));
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * <pre>
|
||||
// * 문서 상태 변경 API
|
||||
// * -.문서에 대해서 열람 상태로 변경. 사용자가 문서열람 시(OTT 검증 완료 후 페이지 로딩 완료 시점) 반드시 문서 열람 상태 변경 API를 호출해야 함.
|
||||
// * -.미 호출 시 아래와 같은 문제 발생
|
||||
// * 1)유통증명시스템을 사용하는 경우 해당 API를 호출한 시점으로 열람정보가 등록되어 미 호출 시 열람정보가 등록 되지 않음.
|
||||
// * 2)문서상태조회 API(/v1/documents/{document_binder_uuid}/status) 호출 시 read_at최초 열람시간) 데이터가 내려가지 않음.
|
||||
// * </pre>
|
||||
// * @param reqDTO KkopayDocAttrDTO.DocumentBinderUuid
|
||||
// * @return ApiResponseDTO<Void>
|
||||
// */
|
||||
// @Operation(hidden = true, summary = "문서 상태 변경", description = "문서 상태 변경")
|
||||
// @PostMapping(value = "/modifyStatus", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
// public IApiResponse modifyStatus(
|
||||
// @RequestBody final KkopayDocAttrDTO.DocumentBinderUuid reqDTO
|
||||
// ) {
|
||||
// return ApiResponseDTO.of(service.modifyStatus(reqDTO));
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * <pre>
|
||||
// * 문서 상태 조회 API
|
||||
// * -.이용기관 서버에서 카카오페이 전자문서 서버로 문서 상태에 대한 조회를 요청 합니다.
|
||||
// * : 발송된 문서의 진행상태를 알고 싶은 경우, flow와 상관없이 요청 가능
|
||||
// * : polling 방식으로 호출할 경우, 호출 간격은 5초를 권장.
|
||||
// * -.doc_box_status 상태변경순서
|
||||
// * : SENT(송신) > RECEIVED(수신) > READ(열람)/EXPIRED(미열람자료의 기한만료)
|
||||
// * </pre>
|
||||
// * @param reqDTO KkopayDocAttrDTO.DocumentBinderUuid
|
||||
// * @return ApiResponseDTO<KkopayDocDTO.DocStatusResponse>
|
||||
// */
|
||||
// @Operation(hidden = true, summary = "문서 상태 조회", description = "문서 상태 조회")
|
||||
// @PostMapping(value = "/findStatus", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
// public IApiResponse findStatus(
|
||||
// @RequestBody final KkopayDocAttrDTO.DocumentBinderUuid reqDTO
|
||||
// ) {
|
||||
// return ApiResponseDTO.of(service.findStatus(reqDTO));
|
||||
// }
|
||||
//
|
||||
//
|
||||
// @Operation(hidden = true, summary = "대량 문서발송 요청", description = "카카오페이 전자문서 서버로 대량 문서발송 처리를 요청")
|
||||
// @PostMapping(value = "/documents/bulk", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
// public IApiResponse requestSendBulk(
|
||||
// @RequestBody final KkopayDocBulkDTO.BulkSendRequests reqDTO
|
||||
// ) {
|
||||
// return ApiResponseDTO.of(service.requestSendBulk(reqDTO));
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * <pre>
|
||||
// * 모바일웹 연계 문서발송 요청
|
||||
// * -.이용기관 서버에서 전자문서 서버로 문서발송 처리를 요청합니다.
|
||||
// * </pre>
|
||||
// * @param reqDTO KkopayDocBulkDTO.BulkStatusRequests
|
||||
// * @return ApiResponseDTOApiResponseDTO<BulkStatusResponses.BulkStatusResponses>
|
||||
// */
|
||||
// @io.swagger.v3.oas.annotations.parameters.RequestBody(required = true, content = {
|
||||
// @Content(mediaType = "application/json", examples = {
|
||||
// @ExampleObject(value = "{\"document_binder_uuids\": [\n"
|
||||
// + " \"BIN-883246dbff7b11edb3bb7affed8a016d\"\n"
|
||||
// + " ]}")
|
||||
// })
|
||||
// })
|
||||
// @Operation(hidden = true, summary = "대량 문서 상태 조회 요청", description = "카카오페이 전자문서 서버로 대량 문서 상태 조회 요청")
|
||||
// @PostMapping(value = "/documents/bulk/status", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
// public IApiResponse findBulkStatus(
|
||||
// @RequestBody final KkopayDocBulkDTO.BulkStatusRequests reqDTO
|
||||
// ) {
|
||||
// return ApiResponseDTO.of(service.findBulkStatus(reqDTO));
|
||||
// }
|
||||
// }
|
@ -1,95 +0,0 @@
|
||||
package kr.xit.ens.kakao.talk.service;
|
||||
|
||||
import kr.xit.biz.ens.model.kakao.talk.KkotalkApiDTO;
|
||||
import kr.xit.biz.ens.model.kakao.talk.KkotalkDTO;
|
||||
import kr.xit.core.model.ApiResponseDTO;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description : 카카오 페이 전자 문서 발송 요청 인터 페이스
|
||||
* packageName : kr.xit.ens.kakao.talk.service
|
||||
* fileName : IKkopayEltrcDocService
|
||||
* author : julim
|
||||
* date : 2023-04-28
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2023-04-28 julim 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
public interface IKkotalkEltrcDocService {
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 모바일웹 연계 문서발송 요청
|
||||
* -.이용기관 서버에서 전자문서 서버로 문서발송 처리를 요청합니다.
|
||||
* </pre>
|
||||
* @param reqDTO KkotalkApiDTO.SendRequest
|
||||
* @return KkotalkApiDTO.SendResponse
|
||||
*/
|
||||
KkotalkDTO.SendResponse requestSend(final KkotalkDTO.SendRequest reqDTO);
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 토큰 유효성 검증(Redirect URL 접속 허용/불허)
|
||||
* </pre>
|
||||
* @param reqDTO KkotalkApiDTO.ValidTokenRequest
|
||||
* @return KkotalkApiDTO.ValidTokenResponse>
|
||||
*/
|
||||
KkotalkApiDTO.ValidTokenResponse validToken(final KkotalkApiDTO.ValidTokenRequest reqDTO);
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 문서 열람 처리 API
|
||||
* -.문서에 대해서 열람 상태로 변경. 사용자가 문서열람 시(OTT 검증 완료 후 페이지 로딩 완료 시점) 반드시 문서 열람 상태 변경 API를 호출해야 함.
|
||||
* -.미 호출 시 아래와 같은 문제 발생
|
||||
* 1)유통증명시스템을 사용하는 경우 해당 API를 호출한 시점으로 열람정보가 등록되어 미 호출 시 열람정보가 등록 되지 않음.
|
||||
* 2)문서상태조회 API(/v1/envelopes/${ENVELOPE_ID}/read) 호출 시 read_at최초 열람시간) 데이터가 내려가지 않음.
|
||||
* </pre>
|
||||
* @param reqDTO KkotalkDTO.EnvelopeId
|
||||
*/
|
||||
void modifyStatus(final KkotalkDTO.EnvelopeId reqDTO);
|
||||
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 문서 상태 조회 API
|
||||
* -.이용기관 서버에서 카카오페이 전자문서 서버로 문서 상태에 대한 조회를 요청 합니다.
|
||||
* : 발송된 문서의 진행상태를 알고 싶은 경우, flow와 상관없이 요청 가능
|
||||
* : polling 방식으로 호출할 경우, 호출 간격은 5초를 권장.
|
||||
* -.doc_box_status 상태변경순서
|
||||
* : RECEIVE(수신, 미처리) > READ(열람)/EXPIRED
|
||||
* </pre>
|
||||
* @param reqDTO KkotalkDTO.EnvelopeId
|
||||
* @return KkotalkApiDTO.EnvelopeStatusResponse
|
||||
*/
|
||||
KkotalkApiDTO.EnvelopeStatusResponse findStatus(final KkotalkApiDTO.EnvelopeId reqDTO);
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 대량(bulk) 문서발송 요청
|
||||
* -.이용기관 서버에서 카카오페이 내문서함 서버로 대량(bulk) 문서발송 처리를 요청합니다.
|
||||
* </pre>
|
||||
* @param reqDTO KkopayDocBulkDTO.BulkSendRequests
|
||||
* @return KkopayDocBulkDTO.BulkSendResponses
|
||||
*/
|
||||
KkotalkDTO.BulkSendResponse requestSendBulk(final KkotalkDTO.BulkSendRequest reqDTO);
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 대량(bulk) 문서 상태 조회 API
|
||||
* -.이용기관 서버에서 카카오페이 전자문서 서버로 문서 상태에 대한 조회를 요청 합니다.
|
||||
* : 발송된 문서의 진행상태를 알고 싶은 경우, flow와 상관없이 요청 가능
|
||||
* : polling 방식으로 호출할 경우, 호출 간격은 5초를 권장.
|
||||
* : RECEIVED(수신,미수신) > READ(열람)/EXPIRED
|
||||
* </pre>
|
||||
* @param reqDTO KkotalkDTO.BulkStatusRequest
|
||||
* @return KkotalkDTO.BulkStatusResponse
|
||||
*/
|
||||
KkotalkDTO.BulkStatusResponse findBulkStatus(final KkotalkDTO.BulkStatusRequest reqDTO);
|
||||
|
||||
|
||||
ApiResponseDTO<KkotalkApiDTO.ValidTokenResponse> findKkotalkReadyAndMblPage(KkotalkApiDTO.ValidTokenRequest reqDTO);
|
||||
}
|
||||
|
@ -1,327 +0,0 @@
|
||||
package kr.xit.ens.kakao.talk.service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.validation.ConstraintViolation;
|
||||
import javax.validation.Validation;
|
||||
import javax.validation.Validator;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import kr.xit.biz.common.ApiConstants.SndngSeCode;
|
||||
import kr.xit.biz.ens.model.cmm.CmmEnsRequestDTO;
|
||||
import kr.xit.biz.ens.model.cmm.CmmEnsRlaybsnmDTO;
|
||||
import kr.xit.biz.ens.model.kakao.talk.KkotalkApiDTO;
|
||||
import kr.xit.biz.ens.model.kakao.talk.KkotalkDTO;
|
||||
import kr.xit.core.exception.BizRuntimeException;
|
||||
import kr.xit.core.model.ApiResponseDTO;
|
||||
import kr.xit.core.service.AbstractService;
|
||||
import kr.xit.core.spring.annotation.TraceLogging;
|
||||
import kr.xit.core.spring.util.ApiWebClientUtil;
|
||||
import kr.xit.core.support.utils.Checks;
|
||||
import kr.xit.core.support.utils.JsonUtils;
|
||||
import kr.xit.ens.cmm.CmmEnsUtils;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description : 카카오 페이 전자 문서 발송 요청 서비스
|
||||
* packageName : kr.xit.ens.kakao.talk.service
|
||||
* fileName : KkopayEltrcDocService
|
||||
* author : julim
|
||||
* date : 2023-04-28
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2023-04-28 julim 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
@Component
|
||||
public class KkotalkEltrcDocService extends AbstractService implements
|
||||
IKkotalkEltrcDocService {
|
||||
|
||||
@Value("${app.contract.kakao.api.talk.host}")
|
||||
private String HOST;
|
||||
|
||||
@Value("#{'${app.contract.kakao.api.talk.send}'.split(';')}")
|
||||
private String[] API_SEND;
|
||||
|
||||
@Value("#{'${app.contract.kakao.api.talk.bulksend}'.split(';')}")
|
||||
private String[] API_BULKSEND;
|
||||
|
||||
@Value("#{'${app.contract.kakao.api.talk.validToken}'.split(';')}")
|
||||
private String[] API_VALID_TOKEN;
|
||||
|
||||
@Value("#{'${app.contract.kakao.api.talk.modifyStatus}'.split(';')}")
|
||||
private String[] API_MODIFY_STATUS;
|
||||
|
||||
|
||||
@Value("#{'${app.contract.kakao.api.talk.bulkstatus}'.split(';')}")
|
||||
private String[] API_BULKSTATUS;
|
||||
|
||||
private final ApiWebClientUtil webClient;
|
||||
private static final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
|
||||
private static final CharSequence ENVELOPE_ID = "{ENVELOPE_ID}";
|
||||
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 모바일웹 연계 문서발송 요청 : POST
|
||||
* -.이용기관 서버에서 전자문서 서버로 문서발송 처리 요청
|
||||
* </pre>
|
||||
* @param reqDTO KkoPayEltrDocDTO.RequestSendReq
|
||||
* @return ApiResponseDTO<KkopayDocDTO.SendResponse>
|
||||
*/
|
||||
@Override
|
||||
@TraceLogging
|
||||
public KkotalkDTO.SendResponse requestSend(final KkotalkDTO.SendRequest reqDTO) {
|
||||
if(Checks.isEmpty(reqDTO.getProductCode())){
|
||||
throw BizRuntimeException.create("상품 코드는 필수 입니다.");
|
||||
}
|
||||
List<String> errors = new ArrayList<>();
|
||||
errors = validate(reqDTO.getEnvelope(), errors);
|
||||
|
||||
final KkotalkApiDTO.Envelope envelope = reqDTO.getEnvelope();
|
||||
if(envelope.getReviewExpiresAt() != null){
|
||||
if(envelope.getReviewExpiresAt().compareTo(envelope.getReadExpiresAt()) < 0){
|
||||
errors.add("reviewExpiresAt=재열람 만료일시를 최조 열람 만료일시 보다 큰 날짜로 입력해주세요.");
|
||||
}
|
||||
}
|
||||
|
||||
if(Checks.isEmpty(envelope.getCi())){
|
||||
if(Checks.isEmpty(envelope.getName())) Objects.requireNonNull(errors).add("name=받는이 이름은 필수입니다.");
|
||||
if(Checks.isEmpty(envelope.getPhoneNumber())) Objects.requireNonNull(errors).add("phoneNumber=받는이 전화번호는 필수입니다.");
|
||||
if(Checks.isEmpty(envelope.getBirthday())) Objects.requireNonNull(errors).add("birthday=받는이 생년월일은 필수입니다.");
|
||||
}
|
||||
if(!Objects.requireNonNull(errors).isEmpty()) throw BizRuntimeException.create(errors.toString());
|
||||
return webClient.exchangeKkotalk(
|
||||
HOST + API_SEND[0].replace("{PRODUCT_CODE}", reqDTO.getProductCode()),
|
||||
HttpMethod.valueOf(API_SEND[1]),
|
||||
JsonUtils.toJson(envelope),
|
||||
KkotalkDTO.SendResponse.class,
|
||||
getRlaybsnmInfo(reqDTO));
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 토큰 유효성 검증(Redirect URL 접속 허용/불허) : GET
|
||||
* </pre>
|
||||
* @param reqDTO KkopayDocDTO.ValidTokenRequest
|
||||
* @return ApiResponseDTO<KkopayDocDTO.ValidTokenResponse>
|
||||
*/
|
||||
@Override
|
||||
@TraceLogging
|
||||
public KkotalkApiDTO.ValidTokenResponse validToken(final KkotalkApiDTO.ValidTokenRequest reqDTO) {
|
||||
validate(reqDTO, null);
|
||||
|
||||
return webClient.exchangeKkotalk(
|
||||
HOST
|
||||
+ API_VALID_TOKEN[0].replace(ENVELOPE_ID, reqDTO.getEnvelopeId())
|
||||
.replace("{TOKEN}", reqDTO.getToken()),
|
||||
HttpMethod.valueOf(API_VALID_TOKEN[1]),
|
||||
null,
|
||||
KkotalkApiDTO.ValidTokenResponse.class,
|
||||
getRlaybsnmInfo(reqDTO));
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 문서 열람 처리 API : POST
|
||||
* -.문서에 대해서 열람 상태로 변경. 사용자가 문서열람 시(OTT 검증 완료 후 페이지 로딩 완료 시점) 반드시 문서 열람 상태 변경 API를 호출해야 함.
|
||||
* -.미 호출 시 아래와 같은 문제 발생
|
||||
* 1)유통증명시스템을 사용하는 경우 해당 API를 호출한 시점으로 열람정보가 등록되어 미 호출 시 열람정보가 등록 되지 않음.
|
||||
* 2)문서상태조회 API(/v1/envelopes/${ENVELOPE_ID}/read) 호출 시 read_at최초 열람시간) 데이터가 내려가지 않음.
|
||||
* </pre>
|
||||
* @param reqDTO KkopayDocAttrDTO.EnvelopeId
|
||||
*/
|
||||
@Override
|
||||
@TraceLogging
|
||||
public void modifyStatus(final KkotalkDTO.EnvelopeId reqDTO){
|
||||
validate(reqDTO.getEnvelopeId(), null);
|
||||
|
||||
final String url = HOST + API_MODIFY_STATUS[0].replace(ENVELOPE_ID, reqDTO.getEnvelopeId());
|
||||
|
||||
webClient.exchangeKkotalk(url, HttpMethod.valueOf(API_MODIFY_STATUS[1]), null, Void.class, getRlaybsnmInfo(reqDTO));
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 문서 상태 조회 API : GET
|
||||
* -.이용기관 서버에서 카카오페이 전자문서 서버로 문서 상태에 대한 조회를 요청 합니다.
|
||||
* : 발송된 문서의 진행상태를 알고 싶은 경우, flow와 상관없이 요청 가능
|
||||
* : polling 방식으로 호출할 경우, 호출 간격은 5초를 권장.
|
||||
* : RECEIVE(수신,미수신) > READ(열람)/EXPIRED
|
||||
* </pre>
|
||||
* @param reqDTO KkotalkDTO.EnvelopeId
|
||||
* @return KkotalkApiDTO.EnvelopeStatusResponse
|
||||
*/
|
||||
@Override
|
||||
@TraceLogging
|
||||
public KkotalkApiDTO.EnvelopeStatusResponse findStatus(final KkotalkApiDTO.EnvelopeId reqDTO){
|
||||
validate(reqDTO, null);
|
||||
|
||||
String param = "{\"envelopeIds\":" + JsonUtils.toJson(List.of(reqDTO.getEnvelopeId())) + "}";
|
||||
KkotalkDTO.BulkStatusResponse res = webClient.exchangeKkotalk(
|
||||
HOST + API_BULKSTATUS[0],
|
||||
HttpMethod.valueOf(API_BULKSTATUS[1]),
|
||||
param,
|
||||
KkotalkDTO.BulkStatusResponse.class,
|
||||
getRlaybsnmInfo(reqDTO));
|
||||
return res.getEnvelopeStatus().get(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 모바일웹 연계 문서발송 요청 : POST
|
||||
* -.이용기관 서버에서 전자문서 서버로 문서발송 처리를 요청합니다.
|
||||
* </pre>
|
||||
* @param reqDTO KkotalkDTO.BulkSendRequest
|
||||
* @return KkotalkDTO.BulkSendResponse
|
||||
*/
|
||||
@Override
|
||||
@TraceLogging
|
||||
public KkotalkDTO.BulkSendResponse requestSendBulk(final KkotalkDTO.BulkSendRequest reqDTO) {
|
||||
if(Checks.isEmpty(reqDTO.getProductCode())){
|
||||
throw BizRuntimeException.create("상품 코드는 필수 입니다.");
|
||||
}
|
||||
|
||||
List<String> errors = new ArrayList<>();
|
||||
|
||||
List<KkotalkApiDTO.Envelope> envelopes = reqDTO.getEnvelopes();
|
||||
for(int idx = 0; idx < envelopes.size(); idx++) {
|
||||
final Set<ConstraintViolation<KkotalkApiDTO.Envelope>> list = validator.validate(envelopes.get(idx));
|
||||
if (!list.isEmpty()) {
|
||||
|
||||
int finalIdx = idx;
|
||||
errors.addAll(list.stream()
|
||||
.map(row -> String.format("%s[%d]=%s", row.getPropertyPath(), finalIdx +1, row.getMessageTemplate()))
|
||||
.toList()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
for(int idx = 0; idx < envelopes.size(); idx++) {
|
||||
final KkotalkApiDTO.Envelope envelope = envelopes.get(idx);
|
||||
|
||||
if(envelope.getReviewExpiresAt() != null){
|
||||
if(envelope.getReviewExpiresAt().compareTo(envelope.getReadExpiresAt()) < 0){
|
||||
errors.add("reviewExpiresAt=재열람 만료일시를 최조 열람 만료일시 보다 큰 날짜로 입력해주세요.");
|
||||
}
|
||||
}
|
||||
|
||||
if (Checks.isEmpty(envelope.getCi())) {
|
||||
if (Checks.isEmpty(envelope.getName())) errors.add(String.format("받는이 이름은 필수입니다(name[%d] 번째 오류)", idx+1));
|
||||
if (Checks.isEmpty(envelope.getPhoneNumber())) errors.add(String.format("받는이 전화번호는 필수입니다(phoneNumber[%d] 번째 오류)", idx+1));
|
||||
if (Checks.isEmpty(envelope.getBirthday())) errors.add(String.format("받는이 생년월일은 필수입니다(birthday[%d] 번째 오류)", idx+1));
|
||||
} else {
|
||||
final StringBuilder sb = new StringBuilder()
|
||||
.append(StringUtils.defaultString(envelope.getName(), StringUtils.EMPTY))
|
||||
.append(StringUtils.defaultString(envelope.getPhoneNumber(), StringUtils.EMPTY))
|
||||
.append(StringUtils.defaultString(envelope.getBirthday(), StringUtils.EMPTY));
|
||||
|
||||
if(Checks.isNotEmpty(sb.toString())){
|
||||
errors.add(String.format("CI가 지정 되었습니다(받는이 정보 불필요:[%d] 번째 오류) .", idx+1));
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!errors.isEmpty()){
|
||||
throw BizRuntimeException.create(errors.toString());
|
||||
}
|
||||
String param = "{\"envelopes\":" + JsonUtils.toJson(envelopes) + "}";
|
||||
return webClient.exchangeKkotalk(
|
||||
HOST + API_BULKSEND[0].replace("{PRODUCT_CODE}", reqDTO.getProductCode()),
|
||||
HttpMethod.valueOf(API_BULKSEND[1]),
|
||||
param,
|
||||
KkotalkDTO.BulkSendResponse.class,
|
||||
getRlaybsnmInfo(reqDTO));
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 대량(bulk) 문서 상태 조회 API : POST
|
||||
* -.이용기관 서버에서 카카오페이 전자문서 서버로 문서 상태에 대한 조회를 요청 합니다.
|
||||
* : 발송된 문서의 진행상태를 알고 싶은 경우, flow와 상관없이 요청 가능
|
||||
* : polling 방식으로 호출할 경우, 호출 간격은 5초를 권장.
|
||||
* : RECEIVE(수신,미수신) > READ(열람)/EXPIRED
|
||||
* </pre>
|
||||
* @param reqDTO KkotalkDTO.BulkStatusRequest
|
||||
* @return KkotalkDTO.BulkStatusResponse
|
||||
*/
|
||||
@Override
|
||||
@TraceLogging
|
||||
public KkotalkDTO.BulkStatusResponse findBulkStatus(final KkotalkDTO.BulkStatusRequest reqDTO) {
|
||||
List<String> errors = new ArrayList<>();
|
||||
|
||||
List<String> envelopes = reqDTO.getEnvelopes();
|
||||
for(int idx = 0; idx < envelopes.size(); idx++) {
|
||||
final String binderUuid = envelopes.get(idx);
|
||||
if (Checks.isEmpty(binderUuid) || binderUuid.length() > 40) {
|
||||
errors.add(String.format("문서 식별 번호는 40자를 넘을 수 없습니다[%d번째]", idx+1));
|
||||
}
|
||||
}
|
||||
if(!errors.isEmpty()) {
|
||||
throw BizRuntimeException.create(errors.toString());
|
||||
}
|
||||
String param = "{\"envelopeIds\":" + JsonUtils.toJson(envelopes) + "}";
|
||||
return webClient.exchangeKkotalk(
|
||||
HOST + API_BULKSTATUS[0],
|
||||
HttpMethod.valueOf(API_BULKSTATUS[1]),
|
||||
param,
|
||||
KkotalkDTO.BulkStatusResponse.class,
|
||||
getRlaybsnmInfo(reqDTO));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiResponseDTO<KkotalkApiDTO.ValidTokenResponse> findKkotalkReadyAndMblPage(final KkotalkApiDTO.ValidTokenRequest reqDTO) {
|
||||
final String url = HOST + API_VALID_TOKEN[0].replace(ENVELOPE_ID, reqDTO.getEnvelopeId())
|
||||
.replace("{TOKEN}", reqDTO.getToken());
|
||||
|
||||
// 유효성 검증
|
||||
final KkotalkApiDTO.ValidTokenResponse validTokenRes = webClient.exchangeKkotalk(url, HttpMethod.valueOf(API_VALID_TOKEN[1]), null,
|
||||
KkotalkApiDTO.ValidTokenResponse.class, getRlaybsnmInfo(reqDTO));
|
||||
|
||||
// 문서상태 변경
|
||||
final String url2 = HOST + API_MODIFY_STATUS[0].replace(ENVELOPE_ID, reqDTO.getEnvelopeId());
|
||||
|
||||
// 정상 : HttpStatus.NO_CONTENT(204) return
|
||||
// error : body에 error_code, error_message return
|
||||
final KkotalkApiDTO.KkotalkErrorDTO errorDTO = webClient.exchangeKkotalk(url2, HttpMethod.valueOf(API_MODIFY_STATUS[1]), null, KkotalkApiDTO.KkotalkErrorDTO.class, getRlaybsnmInfo(reqDTO));
|
||||
if(errorDTO != null){
|
||||
return ApiResponseDTO.error(errorDTO.getErrorCode(), errorDTO.getErrorMessage());
|
||||
}
|
||||
return ApiResponseDTO.success();
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
private static <T> List<String> validate(T t, List<String> errList) {
|
||||
final Set<ConstraintViolation<T>> list = validator.validate(t);
|
||||
|
||||
if(!list.isEmpty()) {
|
||||
final List<String> errors = list.stream()
|
||||
.map(row -> String.format("%s=%s", row.getPropertyPath(), row.getMessageTemplate()))
|
||||
.toList();
|
||||
|
||||
// 추가적인 유효성 검증이 필요 없는 경우
|
||||
if(errList == null){
|
||||
if(!errors.isEmpty()) throw BizRuntimeException.create(errors.toString());
|
||||
return null;
|
||||
}
|
||||
errList.addAll(errors);
|
||||
}
|
||||
return errList;
|
||||
}
|
||||
|
||||
private CmmEnsRlaybsnmDTO getRlaybsnmInfo(final CmmEnsRequestDTO request){
|
||||
return CmmEnsUtils.getRlaybsnmInfo(request.getSignguCode(), request.getFfnlgCode(), SndngSeCode.KAKAO);
|
||||
}
|
||||
}
|
@ -1,261 +0,0 @@
|
||||
package kr.xit.ens.kakao.talk.web;
|
||||
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.media.Content;
|
||||
import io.swagger.v3.oas.annotations.media.ExampleObject;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import kr.xit.biz.ens.model.kakao.talk.KkotalkApiDTO;
|
||||
import kr.xit.biz.ens.model.kakao.talk.KkotalkDTO;
|
||||
import kr.xit.core.model.ApiResponseDTO;
|
||||
import kr.xit.core.model.IApiResponse;
|
||||
import kr.xit.ens.kakao.talk.service.IKkotalkEltrcDocService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description : 카카오톡 전자 문서 발송 controller
|
||||
* packageName : kr.xit.ens.kakao.talk.web
|
||||
* fileName : KkotalkEltrcDocController
|
||||
* author : julim
|
||||
* date : 2024-08-12
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024-08-12 julim 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Tag(name = "KkotalkEltrcDocController", description = "카카오톡 전자문서 API")
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping(value = "/api/ens/kakao/v2")
|
||||
public class KkotalkEltrcDocController {
|
||||
private final IKkotalkEltrcDocService service;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 모바일웹 연계 문서발송 요청
|
||||
* -.이용기관 서버에서 전자문서 서버로 문서발송 처리를 요청합니다.
|
||||
* </pre>
|
||||
* @param reqDTO KkopayDocDTO.SendRequest
|
||||
* @return ApiResponseDTO<KkopayDocDTO.SendResponse>
|
||||
*/
|
||||
@Operation(summary = "문서발송 요청", description = "카카오톡 전자문서 서버로 문서발송 처리를 요청")
|
||||
@io.swagger.v3.oas.annotations.parameters.RequestBody(required = true, content = {
|
||||
@Content(mediaType = "application/json", examples = {
|
||||
@ExampleObject(
|
||||
name = "D10",
|
||||
value = """
|
||||
{
|
||||
"productCode": "D10_1",
|
||||
"envelope": {
|
||||
"title": "전자문서",
|
||||
"content": {
|
||||
"link": "https://nps.or.kr"
|
||||
},
|
||||
"guide": "국민연금 공단에서 보내는 문서입니다.",
|
||||
"payload": "이용기관 페이로드",
|
||||
"readExpiresAt": "2023-12-31T10:00:00",
|
||||
"reviewExpiresAt": "2023-12-31T13:00:00",
|
||||
"useNonPersonalizedNotification": true,
|
||||
"phoneNumber": "01099999999",
|
||||
"name": "홍길동",
|
||||
"birthday": "20000303",
|
||||
"externalId": "external_id1"
|
||||
},
|
||||
"signguCode": "51110",
|
||||
"ffnlgCode": "11"
|
||||
}
|
||||
"""),
|
||||
@ExampleObject(
|
||||
name = "D11",
|
||||
value = """
|
||||
{
|
||||
"productCode": "D11_1",
|
||||
"envelope": {
|
||||
"title": "전자문서",
|
||||
"content": {
|
||||
"html": "<!DOCTYPEhtml><html><body><h1>MyFirstHeading</h1><p>Myfirstparagraph.</p></body></html>"
|
||||
},
|
||||
"guide": "국민연금 공단에서 보내는 문서입니다.",
|
||||
"readExpiresAt": "2023-12-31T10:00:00",
|
||||
"reviewExpiresAt": "2023-12-31T13:00:00",
|
||||
"ci": "${CI}"
|
||||
},
|
||||
"signguCode": "51110",
|
||||
"ffnlgCode": "11"
|
||||
}
|
||||
""")
|
||||
})
|
||||
})
|
||||
@PostMapping(value = "/envelopes", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public IApiResponse requestSend(
|
||||
@RequestBody final KkotalkDTO.SendRequest reqDTO
|
||||
) {
|
||||
return ApiResponseDTO.success(service.requestSend(reqDTO));
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 토큰 유효성 검증(Redirect URL 접속 허용/불허)
|
||||
* </pre>
|
||||
* @param reqDTO KkopayDocDTO.ValidTokenRequest
|
||||
* @return ApiResponseDTO<KkopayDocDTO.ValidTokenResponse>
|
||||
*/
|
||||
@Operation(summary = "토큰 유효성 검증", description = "Redirect URL 접속 허용/불허")
|
||||
@PostMapping(value = "/validToken", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public IApiResponse validToken(
|
||||
@RequestBody final KkotalkDTO.ValidTokenRequest reqDTO
|
||||
) {
|
||||
return ApiResponseDTO.success(service.validToken(reqDTO));
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 문서 열람처리 API
|
||||
* -.문서에 대해서 열람 상태로 변경. 사용자가 문서열람 시(OTT 검증 완료 후 페이지 로딩 완료 시점) 반드시 문서 열람 상태 변경 API를 호출해야 함.
|
||||
* -.미 호출 시 아래와 같은 문제 발생
|
||||
* 1)유통증명시스템을 사용하는 경우 해당 API를 호출한 시점으로 열람정보가 등록되어 미 호출 시 열람정보가 등록 되지 않음.
|
||||
* 2)문서상태조회 API(/v1/envelopes/${ENVELOPE_ID}/read) 호출 시 read_at최초 열람시간) 데이터가 내려가지 않음.
|
||||
* </pre>
|
||||
* @param reqDTO KkotalkApiDTO.EnvelopeStatusResponse
|
||||
* @return ApiResponseDTO<Void>
|
||||
*/
|
||||
@Operation(summary = "문서열람처리(문서 상태 변경)", description = "문서열람처리(문서 상태 변경)")
|
||||
@PostMapping(value = "/modifyStatus", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public IApiResponse modifyStatus(
|
||||
@RequestBody final KkotalkApiDTO.EnvelopeId reqDTO
|
||||
) {
|
||||
service.modifyStatus(reqDTO);
|
||||
return ApiResponseDTO.empty();
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 문서 상태 조회 API
|
||||
* -.이용기관 서버에서 카카오페이 전자문서 서버로 문서 상태에 대한 조회를 요청 합니다.
|
||||
* : 발송된 문서의 진행상태를 알고 싶은 경우, flow와 상관없이 요청 가능
|
||||
* : polling 방식으로 호출할 경우, 호출 간격은 5초를 권장.
|
||||
* -.doc_box_status 상태변경순서
|
||||
* : SENT(송신) > RECEIVED(수신) > READ(열람)/EXPIRED(미열람자료의 기한만료)
|
||||
* </pre>
|
||||
* @param reqDTO KkotalkDTO.EnvelopeId
|
||||
* @return ApiResponseDTO<KkotalkApiDTO.EnvelopeStatusResponse>
|
||||
*/
|
||||
@Operation(summary = "문서 상태 조회", description = "문서 상태 조회")
|
||||
@PostMapping(value = "/findStatus", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public IApiResponse findStatus(
|
||||
@RequestBody final KkotalkApiDTO.EnvelopeId reqDTO
|
||||
) {
|
||||
return ApiResponseDTO.success(service.findStatus(reqDTO));
|
||||
}
|
||||
|
||||
@Operation(summary = "대량 문서발송 요청 -> batch sendBulks 에서 호출", description = "카카오페이 전자문서 서버로 대량 문서발송 처리를 요청 -> batch sendBulks 에서 호출")
|
||||
@io.swagger.v3.oas.annotations.parameters.RequestBody(required = true, content = {
|
||||
@Content(mediaType = "application/json", examples = {
|
||||
@ExampleObject(
|
||||
name = "D10",
|
||||
value = """
|
||||
{
|
||||
"productCode": "D10_1",
|
||||
"signguCode": "51110",
|
||||
"ffnlgCode": "11",
|
||||
"envelopes": [
|
||||
{
|
||||
"title": "전자문서",
|
||||
"content": {
|
||||
"html": "<!DOCTYPEhtml><html><body><h1>MyFirstHeading</h1><p>Myfirstparagraph.</p></body></html>"
|
||||
},
|
||||
"guide": "국민연금 공단에서 보내는 문서입니다.",
|
||||
"readExpiresAt": "2024-12-31T10:00:00",
|
||||
"reviewExpiresAt": "2025-03-31T13:00:00",
|
||||
"phoneNumber": "01099999999",
|
||||
"name": "홍길동",
|
||||
"birthday": "20000303",
|
||||
"externalId": "external_id1"
|
||||
},
|
||||
{
|
||||
"title": "전자문서",
|
||||
"content": {
|
||||
"html": "<!DOCTYPEhtml><html><body><h1>MyFirstHeading</h1><p>Myfirstparagraph.</p></body></html>"
|
||||
},
|
||||
"guide": "국민연금 공단에서 보내는 문서입니다.",
|
||||
"readExpiresAt": "2024-12-31T10:00:00",
|
||||
"reviewExpiresAt": "2025-03-31T13:00:00",
|
||||
"hash": "b0c34fdc5e2ecb0335919fdad3b2ada28fa3ab90ec16e9055c3e9e05c431c6e8",
|
||||
"ci": "vMtqVxJX56lBgbf9heK3QTc+jVndTfK77i/UJKAzPmBG4n9CazCdd/8YytlFZnN4qofIqgxHpSoiG0yYzgEpJg==",
|
||||
"externalId": "external_id2"
|
||||
}
|
||||
]
|
||||
}
|
||||
"""),
|
||||
@ExampleObject(
|
||||
name = "D11",
|
||||
value = """
|
||||
{
|
||||
"productCode": "D11_1",
|
||||
"signguCode": "51110",
|
||||
"ffnlgCode": "11",
|
||||
"envelopes": [
|
||||
{
|
||||
"title": "전자문서",
|
||||
"content": {
|
||||
"link": "https://nps.or.kr"
|
||||
},
|
||||
"guide": "국민연금 공단에서 보내는 문서입니다.",
|
||||
"payload": "이용기관 페이로드",
|
||||
"readExpiresAt": "2024-12-31T10:00:00",
|
||||
"reviewExpiresAt": "2025-03-31T13:00:00",
|
||||
"phoneNumber": "01099999999",
|
||||
"name": "홍길동",
|
||||
"birthday": "20000303",
|
||||
"externalId": "external_id1"
|
||||
},
|
||||
{
|
||||
"title": "전자문서",
|
||||
"content": {
|
||||
"link": "https://nps.or.kr"
|
||||
},
|
||||
"guide": "국민연금 공단에서 보내는 문서입니다.",
|
||||
"payload": "이용기관 페이로드",
|
||||
"readExpiresAt": "2024-12-31T10:00:00",
|
||||
"reviewExpiresAt": "2025-03-31T13:00:00",
|
||||
"ci": "${CI}",
|
||||
"externalId": "external_id2"
|
||||
}
|
||||
]
|
||||
}
|
||||
""")
|
||||
})
|
||||
})
|
||||
@PostMapping(value = "/envelopes/bulk", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public IApiResponse requestSendBulk(
|
||||
@RequestBody final KkotalkDTO.BulkSendRequest reqDTO
|
||||
) {
|
||||
return ApiResponseDTO.success(service.requestSendBulk(reqDTO));
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 모바일웹 연계 문서발송 요청
|
||||
* -.이용기관 서버에서 전자문서 서버로 문서발송 처리를 요청합니다.
|
||||
* </pre>
|
||||
* @param reqDTO KkotalkApiDTO.BulkStatusRequest
|
||||
* @return KkotalkApiDTO.BulkStatusResponse
|
||||
*/
|
||||
@Operation(summary = "대량 문서 상태 조회 요청 -> batch statusBulks 에서 호출", description = "카카오페이 전자문서 서버로 대량 문서 상태 조회 요청 -> batch statusBulks 에서 호출")
|
||||
@PostMapping(value = "/envelopes/bulk/status", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public IApiResponse findBulkStatus(
|
||||
@RequestBody final KkotalkDTO.BulkStatusRequest reqDTO
|
||||
) {
|
||||
return ApiResponseDTO.success(service.findBulkStatus(reqDTO));
|
||||
}
|
||||
}
|
@ -0,0 +1,179 @@
|
||||
package kr.xit.ens.kakao.web;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.media.Content;
|
||||
import io.swagger.v3.oas.annotations.media.ExampleObject;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import kr.xit.biz.ens.model.kakao.KkopayDocAttrDTO.DocumentBinderUuid;
|
||||
import kr.xit.biz.ens.model.kakao.KkopayDocBulkDTO.BulkSendRequests;
|
||||
import kr.xit.biz.ens.model.kakao.KkopayDocBulkDTO.BulkStatusRequests;
|
||||
import kr.xit.biz.ens.model.kakao.KkopayDocDTO.SendRequest;
|
||||
import kr.xit.biz.ens.model.kakao.KkopayDocDTO.ValidTokenRequest;
|
||||
import kr.xit.core.model.ApiResponseDTO;
|
||||
import kr.xit.core.model.IApiResponse;
|
||||
import kr.xit.ens.kakao.service.IAsyncKkopayEltrcDocService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description : 카카오 페이 전자 문서 발송 비동기용 controller
|
||||
* packageName : kr.xit.ens.kakao.web
|
||||
* fileName : AsyncKkopayEltrcDocController
|
||||
* author : julim
|
||||
* date : 2023-04-28
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2023-04-28 julim 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Tag(name = "AsyncKkopayEltrcDocController", description = "카카오페이 MyDoc API(비동기)")
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping(value = "/api/ens/kakao/v2")
|
||||
public class AsyncKkopayEltrcDocController {
|
||||
|
||||
private final IAsyncKkopayEltrcDocService service;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 모바일웹 연계 문서발송 요청
|
||||
* -.이용기관 서버에서 전자문서 서버로 문서발송 처리를 요청합니다.
|
||||
* </pre>
|
||||
* @param reqDTO KkopayDocDTO.SendRequest
|
||||
* @return ApiResponseDTO<KkopayDocDTO.SendResponse>
|
||||
*/
|
||||
@io.swagger.v3.oas.annotations.parameters.RequestBody(required = true, content = {
|
||||
@Content(mediaType = "application/json", examples = {
|
||||
@ExampleObject(value = """
|
||||
{
|
||||
"document": {
|
||||
"title": "문서 제목",
|
||||
"read_expired_sec": 3600,
|
||||
"hash": "6EFE827AC88914DE471C621AE",
|
||||
"common_categories": [
|
||||
"NOTICE"
|
||||
],
|
||||
"receiver": {
|
||||
"phone_number": "01093414345",
|
||||
"name": "김지호",
|
||||
"birthday": "19831218",
|
||||
"is_required_verify_name": false
|
||||
},
|
||||
"property": {
|
||||
"link": "http://ip:8081/api/kakaopay/v1/ott",
|
||||
"cs_number": "02-123-4567",
|
||||
"cs_name": "콜센터",
|
||||
"payload": "payload 파라미터 입니다.",
|
||||
"message": "해당 안내문은 다음과 같습니다."
|
||||
}
|
||||
},
|
||||
"signguCode": "88328",
|
||||
"ffnlgCode": "11"
|
||||
}
|
||||
""")
|
||||
})
|
||||
})
|
||||
@Operation(hidden = true, summary = "문서발송 요청", description = "카카오페이 전자문서 서버로 문서발송 처리를 요청")
|
||||
@PostMapping(value = "/documents", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public IApiResponse requestSend(
|
||||
@RequestBody final SendRequest reqDTO
|
||||
) {
|
||||
return ApiResponseDTO.of(service.requestSend(reqDTO));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 토큰 유효성 검증(Redirect URL 접속 허용/불허)
|
||||
* </pre>
|
||||
* @param reqDTO KkopayDocDTO.ValidTokenRequest
|
||||
* @return ApiResponseDTO<KkopayDocDTO.ValidTokenResponse>
|
||||
*/
|
||||
@Operation(hidden = true, summary = "토큰 유효성 검증", description = "Redirect URL 접속 허용/불허")
|
||||
@PostMapping(value = "/validToken", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public IApiResponse validToken(
|
||||
@RequestBody final ValidTokenRequest reqDTO
|
||||
) {
|
||||
return ApiResponseDTO.of(service.validToken(reqDTO));
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 문서 상태 변경 API
|
||||
* -.문서에 대해서 열람 상태로 변경. 사용자가 문서열람 시(OTT 검증 완료 후 페이지 로딩 완료 시점) 반드시 문서 열람 상태 변경 API를 호출해야 함.
|
||||
* -.미 호출 시 아래와 같은 문제 발생
|
||||
* 1)유통증명시스템을 사용하는 경우 해당 API를 호출한 시점으로 열람정보가 등록되어 미 호출 시 열람정보가 등록 되지 않음.
|
||||
* 2)문서상태조회 API(/v1/documents/{document_binder_uuid}/status) 호출 시 read_at최초 열람시간) 데이터가 내려가지 않음.
|
||||
* </pre>
|
||||
* @param reqDTO KkopayDocAttrDTO.DocumentBinderUuid
|
||||
* @return ApiResponseDTO<Void>
|
||||
*/
|
||||
@Operation(hidden = true, summary = "문서 상태 변경", description = "문서 상태 변경")
|
||||
@PostMapping(value = "/modifyStatus", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public IApiResponse modifyStatus(
|
||||
@RequestBody final DocumentBinderUuid reqDTO
|
||||
) {
|
||||
return ApiResponseDTO.of(service.modifyStatus(reqDTO));
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 문서 상태 조회 API
|
||||
* -.이용기관 서버에서 카카오페이 전자문서 서버로 문서 상태에 대한 조회를 요청 합니다.
|
||||
* : 발송된 문서의 진행상태를 알고 싶은 경우, flow와 상관없이 요청 가능
|
||||
* : polling 방식으로 호출할 경우, 호출 간격은 5초를 권장.
|
||||
* -.doc_box_status 상태변경순서
|
||||
* : SENT(송신) > RECEIVED(수신) > READ(열람)/EXPIRED(미열람자료의 기한만료)
|
||||
* </pre>
|
||||
* @param reqDTO KkopayDocAttrDTO.DocumentBinderUuid
|
||||
* @return ApiResponseDTO<KkopayDocDTO.DocStatusResponse>
|
||||
*/
|
||||
@Operation(hidden = true, summary = "문서 상태 조회", description = "문서 상태 조회")
|
||||
@PostMapping(value = "/findStatus", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public IApiResponse findStatus(
|
||||
@RequestBody final DocumentBinderUuid reqDTO
|
||||
) {
|
||||
return ApiResponseDTO.of(service.findStatus(reqDTO));
|
||||
}
|
||||
|
||||
|
||||
@Operation(hidden = true, summary = "대량 문서발송 요청", description = "카카오페이 전자문서 서버로 대량 문서발송 처리를 요청")
|
||||
@PostMapping(value = "/documents/bulk", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public IApiResponse requestSendBulk(
|
||||
@RequestBody final BulkSendRequests reqDTO
|
||||
) {
|
||||
return ApiResponseDTO.of(service.requestSendBulk(reqDTO));
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 모바일웹 연계 문서발송 요청
|
||||
* -.이용기관 서버에서 전자문서 서버로 문서발송 처리를 요청합니다.
|
||||
* </pre>
|
||||
* @param reqDTO KkopayDocBulkDTO.BulkStatusRequests
|
||||
* @return ApiResponseDTOApiResponseDTO<BulkStatusResponses.BulkStatusResponses>
|
||||
*/
|
||||
@io.swagger.v3.oas.annotations.parameters.RequestBody(required = true, content = {
|
||||
@Content(mediaType = "application/json", examples = {
|
||||
@ExampleObject(value = "{\"document_binder_uuids\": [\n"
|
||||
+ " \"BIN-883246dbff7b11edb3bb7affed8a016d\"\n"
|
||||
+ " ]}")
|
||||
})
|
||||
})
|
||||
@Operation(hidden = true, summary = "대량 문서 상태 조회 요청", description = "카카오페이 전자문서 서버로 대량 문서 상태 조회 요청")
|
||||
@PostMapping(value = "/documents/bulk/status", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public IApiResponse findBulkStatus(
|
||||
@RequestBody final BulkStatusRequests reqDTO
|
||||
) {
|
||||
return ApiResponseDTO.of(service.findBulkStatus(reqDTO));
|
||||
}
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
package kr.xit.ens.ktgbs.service;
|
||||
|
||||
import kr.xit.biz.ens.model.kt.KtCommonDTO;
|
||||
import kr.xit.biz.ens.model.ktgbs.KtGbsDTO;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
* packageName : kr.xit.ens.ktgbs.service
|
||||
* fileName : IKtGbsService
|
||||
* author : limju
|
||||
* date : 2024-08-19
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024-08-19 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
public interface IKtGbsService {
|
||||
//------------------------------------------------------------------------------
|
||||
// mens 사용 API
|
||||
//------------------------------------------------------------------------------
|
||||
KtCommonDTO.KtCommonResponse mainSend(final KtGbsDTO.MsgSendRequest reqDTO);
|
||||
KtGbsDTO.TokenResponse requestToken(final KtCommonDTO.KtMnsRequest paramDTO);
|
||||
KtCommonDTO.KtCommonResponse cfmToken(final KtGbsDTO.TokenConfirmRequest reqDTO);
|
||||
KtCommonDTO.KtCommonResponse readToken(final KtGbsDTO.TokenReadRequest reqDTO);
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
}
|
@ -1,162 +0,0 @@
|
||||
package kr.xit.ens.ktgbs.service;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import kr.xit.biz.cmm.service.ICmmEnsCacheService;
|
||||
import kr.xit.biz.common.ApiConstants;
|
||||
import kr.xit.biz.ens.model.cmm.CmmEnsRequestDTO;
|
||||
import kr.xit.biz.ens.model.cmm.CmmEnsRlaybsnmDTO;
|
||||
import kr.xit.biz.ens.model.kt.KtCommonDTO;
|
||||
import kr.xit.biz.ens.model.ktgbs.KtGbsDTO;
|
||||
import kr.xit.core.service.AbstractService;
|
||||
import kr.xit.core.spring.annotation.TraceLogging;
|
||||
import kr.xit.core.spring.util.ApiWebClientUtil;
|
||||
import kr.xit.core.support.utils.DateUtils;
|
||||
import kr.xit.core.support.utils.JsonUtils;
|
||||
import kr.xit.ens.cmm.CmmEnsUtils;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
* packageName : kr.xit.ens.ktgbs.service
|
||||
* fileName : KtGbsService
|
||||
* author : limju
|
||||
* date : 2024-08-19
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024-08-19 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class KtGbsService extends AbstractService implements IKtGbsService {
|
||||
@Value("${app.contract.ktgbs.host}")
|
||||
private String HOST;
|
||||
|
||||
@Value("${app.contract.ktgbs.api.access-token}")
|
||||
private String API_ACCESS_TOKEN;
|
||||
|
||||
/**
|
||||
* 토큰인증확인조회 : BC-AG-SN-008
|
||||
*/
|
||||
@Value("${app.contract.ktgbs.api.cfm-token}")
|
||||
private String API_CFM_TOKEN;
|
||||
|
||||
/**
|
||||
* 토큰열람확인결과전송 : BC-AG-SN-009
|
||||
*/
|
||||
@Value("${app.contract.ktgbs.api.read-token}")
|
||||
private String API_READ_TOKEN;
|
||||
|
||||
/**
|
||||
* 본문자수신등록
|
||||
*/
|
||||
@Value("${app.contract.ktgbs.api.main-send}")
|
||||
private String API_MAIN_SEND;
|
||||
|
||||
private final ApiWebClientUtil webClient;
|
||||
private final ICmmEnsCacheService cacheService;
|
||||
|
||||
@Override
|
||||
@TraceLogging
|
||||
public KtGbsDTO.TokenResponse requestToken(final KtCommonDTO.KtMnsRequest paramDTO) {
|
||||
String profile = StringUtils.isEmpty(paramDTO.getProfile()) ? (ApiConstants.IS_PROFILE_LOCAL? "local" : "prod") : paramDTO.getProfile();
|
||||
paramDTO.setProfile(profile);
|
||||
final CmmEnsRlaybsnmDTO ktMnsInfo = cacheService.getRlaybsnmInfoCache(CmmEnsRequestDTO.builder()
|
||||
.signguCode(paramDTO.getSignguCode())
|
||||
.ffnlgCode(paramDTO.getFfnlgCode())
|
||||
.profile(paramDTO.getProfile())
|
||||
.build());
|
||||
|
||||
final KtGbsDTO.TokenRequest reqDTO = KtGbsDTO.TokenRequest.builder()
|
||||
.clientId(ktMnsInfo.getKtSvcClientId())
|
||||
.clientSecret(ktMnsInfo.getKtSvcClientSecret())
|
||||
.build();
|
||||
CmmEnsUtils.validate(reqDTO);
|
||||
|
||||
final Map<String,String> headerMap = new HashMap<>();
|
||||
headerMap.put(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE);
|
||||
headerMap.put(HttpHeaders.AUTHORIZATION, String.format("Bearer %s", ktMnsInfo.getKtAccessToken()));
|
||||
|
||||
return webClient.exchangeFormData(
|
||||
HOST + API_ACCESS_TOKEN,
|
||||
HttpMethod.POST,
|
||||
reqDTO,
|
||||
KtGbsDTO.TokenResponse.class,
|
||||
headerMap
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
@TraceLogging
|
||||
public KtCommonDTO.KtCommonResponse cfmToken(final KtGbsDTO.TokenConfirmRequest reqDTO) {
|
||||
final CmmEnsRlaybsnmDTO ktMnsInfo = getRlaybsnmInfo(reqDTO);
|
||||
reqDTO.setServiceCd(ktMnsInfo.getKtServiceCode());
|
||||
reqDTO.setSignguCode(null);
|
||||
reqDTO.setFfnlgCode(null);
|
||||
reqDTO.setProfile(null);
|
||||
CmmEnsUtils.validate(reqDTO);
|
||||
|
||||
return webClient.exchangeKtGbs(
|
||||
HOST + API_CFM_TOKEN,
|
||||
HttpMethod.POST,
|
||||
JsonUtils.toJson(reqDTO),
|
||||
KtCommonDTO.KtCommonResponse.class,
|
||||
ktMnsInfo
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
@TraceLogging
|
||||
public KtCommonDTO.KtCommonResponse readToken(final KtGbsDTO.TokenReadRequest reqDTO) {
|
||||
final CmmEnsRlaybsnmDTO ktMnsInfo = getRlaybsnmInfo(reqDTO);
|
||||
reqDTO.setServiceCd(ktMnsInfo.getKtServiceCode());
|
||||
reqDTO.setMmsRdgTmst(DateUtils.getTodayAndNowTime("yyyyMMddHHmmss"));
|
||||
reqDTO.setSignguCode(null);
|
||||
reqDTO.setFfnlgCode(null);
|
||||
reqDTO.setProfile(null);
|
||||
CmmEnsUtils.validate(reqDTO);
|
||||
|
||||
return webClient.exchangeKtGbs(
|
||||
HOST + API_READ_TOKEN,
|
||||
HttpMethod.POST,
|
||||
JsonUtils.toJson(reqDTO),
|
||||
KtCommonDTO.KtCommonResponse.class,
|
||||
ktMnsInfo
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
@TraceLogging
|
||||
public KtCommonDTO.KtCommonResponse mainSend(final KtGbsDTO.MsgSendRequest reqDTO) {
|
||||
final CmmEnsRlaybsnmDTO ktMnsInfo = getRlaybsnmInfo(reqDTO);
|
||||
reqDTO.setServiceCd(ktMnsInfo.getKtServiceCode());
|
||||
reqDTO.setSignguCode(null);
|
||||
reqDTO.setFfnlgCode(null);
|
||||
reqDTO.setProfile(null);
|
||||
CmmEnsUtils.validate(reqDTO);
|
||||
|
||||
return webClient.exchangeKtGbs(
|
||||
HOST + API_MAIN_SEND,
|
||||
HttpMethod.POST,
|
||||
JsonUtils.toJson(reqDTO),
|
||||
KtCommonDTO.KtCommonResponse.class,
|
||||
ktMnsInfo
|
||||
);
|
||||
}
|
||||
|
||||
private CmmEnsRlaybsnmDTO getRlaybsnmInfo(final KtCommonDTO.KtMnsRequest request){
|
||||
return CmmEnsUtils.getRlaybsnmInfo(request.getSignguCode(), request.getFfnlgCode(), ApiConstants.SndngSeCode.KT_GIBIS);
|
||||
}
|
||||
}
|
@ -1,85 +0,0 @@
|
||||
package kr.xit.ens.ktgbs.web;
|
||||
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import kr.xit.biz.ens.model.kt.KtCommonDTO;
|
||||
import kr.xit.biz.ens.model.ktgbs.KtGbsDTO;
|
||||
import kr.xit.core.model.ApiResponseDTO;
|
||||
import kr.xit.core.model.IApiResponse;
|
||||
import kr.xit.ens.ktgbs.service.IKtGbsService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
* packageName : kr.xit.ens.ktgbs.web
|
||||
* fileName : KtGbsController
|
||||
* author : limju
|
||||
* date : 2024-08-19
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024-08-19 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Tag(name = "KtGbsController", description = "KT GIBIS API controller")
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping(value = "/api/ens/ktgbs/v1")
|
||||
public class KtGbsController {
|
||||
private final IKtGbsService service;
|
||||
|
||||
@Operation(summary = "본문자 수신 등록 요청", description = "본문자 수신 등록 요청")
|
||||
@PostMapping(value = "/mainSend", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public IApiResponse mainSend(@RequestBody final KtGbsDTO.MsgSendRequest reqDTO) {
|
||||
KtCommonDTO.KtCommonResponse dto = service.mainSend(reqDTO);
|
||||
return ApiResponseDTO.success(dto);
|
||||
}
|
||||
|
||||
@Operation(deprecated = true, summary = "기관용 토큰 발급 요청 -> 업무(Biz)단 API 에서 처리", description = "KT 문서 중개자 정보 DB update가 필요하여 업무단의 API를 사용하여야 함")
|
||||
@PostMapping(value = "/requestToken", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public IApiResponse requestToken(@RequestBody final KtCommonDTO.KtMnsRequest paramDTO) {
|
||||
return ApiResponseDTO.success(service.requestToken(paramDTO));
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* - 본문자 수신 등록 요청 API 호출시 set한 url
|
||||
* -> OTT token get
|
||||
* - 토큰인증확인조회요청 API call
|
||||
* - 토큰열람확인결과 전송 API call
|
||||
* @param reqDTO TokenConfirmRequest
|
||||
* @return KtCommonResponse
|
||||
* </pre>
|
||||
*/
|
||||
@Operation(deprecated = true, summary = "토큰인증확인 조회 -> KT GIBIS 모바일 데이타 요청(모바일 페이지에서 호출)에서 처리", description = "토큰인증확인조회요청(BC-AG-SN-008) <br><a href='http://localhost:8081/swagger-ui/index.html?urls.primaryName=6.%20%EC%A0%84%EC%9E%90%EA%B3%A0%EC%A7%80%20%EC%97%85%EB%AC%B4%20API#/MobilePageController'>전자문서중개자모바일페이지</a>")
|
||||
@PostMapping(value = "/cfmToken", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public IApiResponse cfmToken(@RequestBody final KtGbsDTO.TokenConfirmRequest reqDTO) {
|
||||
KtCommonDTO.KtCommonResponse dto = service.cfmToken(reqDTO);
|
||||
return ApiResponseDTO.success(dto);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* - 본문자 수신 등록 요청(BC-AG-SN-002) API 호출시 set한 url
|
||||
* -> OTT token get
|
||||
* - 토큰인증확인조회요청(BC-AG-SN-008) API call
|
||||
* - 토큰열람확인결과 전송(BC-AG-SN-009) API call
|
||||
* @param reqDTO KtTokenReadRequest
|
||||
* @return KtCommonResponse
|
||||
* </pre>
|
||||
*/
|
||||
@Operation(deprecated = true, summary = "토큰열람확인결과 전송 -> KT GIBIS 모바일 데이타 요청(모바일 페이지에서 호출)에서 처리", description = "토큰열람확인결과 전송(BC-AG-SN-009) <br><a href='http://localhost:8081/swagger-ui/index.html?urls.primaryName=6.%20%EC%A0%84%EC%9E%90%EA%B3%A0%EC%A7%80%20%EC%97%85%EB%AC%B4%20API#/MobilePageController'>전자문서중개자모바일페이지</a>")
|
||||
@PostMapping(value = "/readToken", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public IApiResponse readToken(@RequestBody final KtGbsDTO.TokenReadRequest reqDTO) {
|
||||
KtCommonDTO.KtCommonResponse dto = service.readToken(reqDTO);
|
||||
return ApiResponseDTO.success(dto);
|
||||
}
|
||||
}
|
@ -1,127 +0,0 @@
|
||||
package kr.xit.ens.ktgbs.web;
|
||||
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.media.Content;
|
||||
import io.swagger.v3.oas.annotations.media.ExampleObject;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import kr.xit.biz.ens.model.kt.KtCommonDTO;
|
||||
import kr.xit.biz.ens.model.ktgbs.KtGbsDTO;
|
||||
import kr.xit.biz.ktgbs.service.IBizKtGbsService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
import javax.servlet.ServletOutputStream;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description : KT GBIS 에서 사용 되는 API
|
||||
* packageName : kr.xit.ens.ktgbs.web
|
||||
* fileName : KtGbsMmsInboundController
|
||||
* author : limju
|
||||
* date : 2024-08-19
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024-08-19 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Tag(name = "KtGbsInboundController", description = "KT GIBIS Inbound API - KT GIBIS 에서 사용하는 API")
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
public class KtGbsInboundController {
|
||||
private final IBizKtGbsService bizService;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 메세지 발송/수신 결과 전송 -> KT GIBIS에서 호출
|
||||
* - KT GBIS 에서 호출 되는 서비스
|
||||
* - url 고정 : http://{각대행사(IP:Port)}/api/msg/result
|
||||
* @param reqDTO KtMsgRsltRequest
|
||||
* @return KtCommonResponse
|
||||
* </pre>
|
||||
*/
|
||||
@io.swagger.v3.oas.annotations.parameters.RequestBody(required = true, content = {
|
||||
@Content(
|
||||
mediaType = "application/json",
|
||||
examples = {
|
||||
@ExampleObject(
|
||||
value = """
|
||||
{
|
||||
"service_cd" : "CD001",
|
||||
"reqs" : [
|
||||
{
|
||||
"src_key" : "OvSsuljd1K-67c1fc38-1a59-4fbe-930e-802db6609140",
|
||||
"mms_sndg_rslt_sqno" : 2,
|
||||
"prcs_dt" : "20240819",
|
||||
"mms_bsns_dvcd" : "01001",
|
||||
"mbl_bzowr_dvcd" : "02",
|
||||
"rl_mms_sndg_telno" : "4230",
|
||||
"mms_rslt_dvcd" : "40",
|
||||
"mms_sndg_tmst" : "20240819090237",
|
||||
"mms_rcv_tmst" : "20240819090239",
|
||||
"mms_rdg_tmst" : "20240819114405",
|
||||
"prev_approve_yn" : "Y",
|
||||
"msg_type" : "2"
|
||||
}
|
||||
]
|
||||
}
|
||||
"""
|
||||
),
|
||||
})
|
||||
})
|
||||
@Operation(summary = "메세지 발송/수신 결과 전송 -> KT GIBIS에서 호출", description = "메세지 발송/수신 결과 전송 -> KT GIBIS에서 호출")
|
||||
//@PostMapping(value = "/goji/kt/gibis/stat/bulk", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
@PostMapping(value = "/goji/api/msg/result", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public KtCommonDTO.KtCommonResponse messageResult(@RequestBody final KtGbsDTO.MsgRsltRequest reqDTO) {
|
||||
return bizService.messageResult(reqDTO);
|
||||
}
|
||||
|
||||
@Operation(summary = "링크이미지 출력")
|
||||
@GetMapping(value = "/goji/sys/util/lnk/img")
|
||||
public void printImg(HttpServletRequest request, HttpServletResponse response, @RequestParam String link, @RequestParam String type) throws IOException {
|
||||
|
||||
String mime = null;
|
||||
if ("jpg".equals(type) || "jpeg".equals(type))
|
||||
mime = "image/jpeg";
|
||||
else if ("png".equals(type))
|
||||
mime = "image/png";
|
||||
else if ("gif".equals(type))
|
||||
mime = "image/gif";
|
||||
else
|
||||
mime = "image/jpeg";
|
||||
|
||||
|
||||
try (InputStream inputStream = new URL(link).openStream();
|
||||
ServletOutputStream outputStream = response.getOutputStream();) {
|
||||
|
||||
response.setHeader("Cache-Control", "no-store");
|
||||
response.setHeader("Pragma", "no-cache");
|
||||
response.setDateHeader("Expires", 0);
|
||||
response.setContentType(mime);
|
||||
|
||||
|
||||
int length;
|
||||
byte[] buffer = new byte[1024];
|
||||
while ((length = inputStream.read(buffer)) != -1) {
|
||||
outputStream.write(buffer, 0, length);
|
||||
}
|
||||
|
||||
|
||||
outputStream.flush();
|
||||
|
||||
} catch (FileNotFoundException e) {
|
||||
response.getWriter().println("File is Not Found." + e.getMessage());
|
||||
} catch (IOException e) {
|
||||
response.getWriter().println("I/O Error Occurred!!. " + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package kr.xit.ens.pplus.mapper;
|
||||
|
||||
import java.util.List;
|
||||
import kr.xit.biz.ens.model.cmm.SndngMssageParam;
|
||||
import kr.xit.biz.ens.model.pplus.PplusDTO.BatchAcceptRequest;
|
||||
import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
*
|
||||
* packageName : kr.xit.ens.pplus.mapper
|
||||
* fileName : IPplusMapper
|
||||
* author : limju
|
||||
* date : 2023-11-01
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2023-11-01 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Mapper
|
||||
public interface IPplusMapper {
|
||||
List<BatchAcceptRequest> selectPostPlusSendTgts(final SndngMssageParam dto);
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
package kr.xit.ens.pplus.service;
|
||||
|
||||
import kr.xit.biz.ens.model.cmm.SndngMssageParam;
|
||||
import kr.xit.biz.ens.model.pplus.PplusDTO.PpCommonResponse;
|
||||
import kr.xit.biz.ens.model.pplus.PplusDTO.PpStatusRequest;
|
||||
import kr.xit.biz.ens.model.pplus.PplusDTO.PpStatusResponse;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
*
|
||||
* packageName : kr.xit.ens.pplus.service
|
||||
* fileName : IPplusService
|
||||
* author : limju
|
||||
* date : 2023-10-04
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2023-10-04 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
public interface IPplusService {
|
||||
PpCommonResponse sendBulks(final SndngMssageParam reqDTO);
|
||||
PpStatusResponse statusBulks(final PpStatusRequest reqDTO);
|
||||
String test();
|
||||
}
|
@ -0,0 +1,156 @@
|
||||
package kr.xit.ens.pplus.service;
|
||||
|
||||
import java.io.File;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import kr.xit.biz.common.ApiConstants.SndngSeCode;
|
||||
import kr.xit.biz.ens.model.cmm.CmmEnsRlaybsnmDTO;
|
||||
import kr.xit.biz.ens.model.cmm.SndngMssageParam;
|
||||
import kr.xit.biz.ens.model.pplus.PplusDTO.BatchAcceptRequest;
|
||||
import kr.xit.biz.ens.model.pplus.PplusDTO.PpCommonResponse;
|
||||
import kr.xit.biz.ens.model.pplus.PplusDTO.PpStatusRequest;
|
||||
import kr.xit.biz.ens.model.pplus.PplusDTO.PpStatusResponse;
|
||||
import kr.xit.biz.other.mapper.IBizOtherMapper;
|
||||
import kr.xit.biz.other.model.ElecnoticeDTO;
|
||||
import kr.xit.core.service.AbstractService;
|
||||
import kr.xit.core.spring.annotation.TraceLogging;
|
||||
import kr.xit.core.spring.util.ApiWebClientUtil;
|
||||
import kr.xit.core.support.utils.FileUtil;
|
||||
import kr.xit.core.support.utils.JsonUtils;
|
||||
import kr.xit.ens.cmm.CmmEnsUtils;
|
||||
import kr.xit.ens.pplus.mapper.IPplusMapper;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.jasypt.encryption.StringEncryptor;
|
||||
import org.json.simple.JSONObject;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
*
|
||||
* packageName : kr.xit.ens.pplus.service
|
||||
* fileName : PplusService
|
||||
* author : limju
|
||||
* date : 2023-10-04
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2023-10-04 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class PplusService extends AbstractService implements IPplusService {
|
||||
@Value("${app.file.cmm.temp-path}")
|
||||
private String FILE_TEMP_PATH;
|
||||
|
||||
@Value("${app.contract.pplus.host}")
|
||||
private String HOST;
|
||||
|
||||
@Value("${app.contract.pplus.api.accept}")
|
||||
private String ACCEPT;
|
||||
|
||||
@Value("${app.contract.pplus.api.status}")
|
||||
private String STATUS;
|
||||
|
||||
private final StringEncryptor jasyptStringEncryptor;
|
||||
private final ApiWebClientUtil webClient;
|
||||
private final IPplusMapper mapper;
|
||||
private final IBizOtherMapper mapper2;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
@TraceLogging
|
||||
public PpCommonResponse sendBulks(final SndngMssageParam reqDTO) {
|
||||
final List<BatchAcceptRequest> tgtList = mapper.selectPostPlusSendTgts(reqDTO);
|
||||
|
||||
if(!tgtList.isEmpty()){
|
||||
JSONObject master = new JSONObject();
|
||||
master.put("cols", JsonUtils.toObject(tgtList.get(0).getMasterCols(), ArrayList.class));
|
||||
master.put("rows", JsonUtils.toObject(tgtList.get(0).getMasterRows(), ArrayList.class));
|
||||
|
||||
JSONObject detail = new JSONObject();
|
||||
detail.put("cols", JsonUtils.toObject(tgtList.get(0).getDetailCols(), ArrayList.class));
|
||||
detail.put("rows", tgtList.stream()
|
||||
.map(d -> jasyptStringEncryptor.decrypt(d.getDetailRows()))
|
||||
.map(d -> JsonUtils.toObject(d, ArrayList.class))
|
||||
.toList());
|
||||
|
||||
JSONObject pstJson = new JSONObject();
|
||||
pstJson.put("master", master);
|
||||
pstJson.put("detail", detail);
|
||||
|
||||
final String unitySndngMstId = tgtList.get(0).getUnitySndngMastrId();
|
||||
FileUtil.saveFile(FILE_TEMP_PATH,unitySndngMstId+".json", pstJson.toJSONString().getBytes(
|
||||
StandardCharsets.UTF_8));
|
||||
return accept(reqDTO, unitySndngMstId);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public PpCommonResponse accept(final SndngMssageParam paramDTO, final String unitySndngMstId) {
|
||||
final CmmEnsRlaybsnmDTO ktMnsInfo = CmmEnsUtils.getRlaybsnmInfo(paramDTO.getSignguCode(), paramDTO.getFfnlgCode(), SndngSeCode.PPLUS);
|
||||
|
||||
MultipartFile pstFile = FileUtil.createMutipartFile(unitySndngMstId + ".json", FILE_TEMP_PATH);
|
||||
|
||||
List<MultipartFile> pstFiles = new ArrayList<>();
|
||||
pstFiles.add(pstFile);
|
||||
|
||||
PpCommonResponse resDTO = webClient.exchangeFileData(
|
||||
HOST + ACCEPT + String.format("?apiKey=%s", ktMnsInfo.getPplusApiKey()),
|
||||
HttpMethod.POST,
|
||||
pstFiles,
|
||||
"pstFile",
|
||||
PpCommonResponse.class
|
||||
);
|
||||
resDTO.setUnitySndngMastrId(unitySndngMstId);
|
||||
|
||||
File file = new File(FILE_TEMP_PATH + "/" +unitySndngMstId + ".json");
|
||||
if(file.exists()) {
|
||||
file.delete();
|
||||
}
|
||||
|
||||
return resDTO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PpStatusResponse statusBulks(PpStatusRequest reqDTO) {
|
||||
final CmmEnsRlaybsnmDTO ktMnsInfo = CmmEnsUtils.getRlaybsnmInfo(reqDTO.getSignguCode(), reqDTO.getFfnlgCode(), SndngSeCode.PPLUS);
|
||||
reqDTO.setApiKey(ktMnsInfo.getPplusApiKey());
|
||||
reqDTO.setSignguCode(null);
|
||||
reqDTO.setFfnlgCode(null);
|
||||
reqDTO.setProfile(null);
|
||||
reqDTO.setTry1(null);
|
||||
CmmEnsUtils.validate(reqDTO);
|
||||
|
||||
final Map<String,String> headerMap = new HashMap<>();
|
||||
headerMap.put(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE);
|
||||
|
||||
return webClient.exchangeFormData(
|
||||
HOST + STATUS,
|
||||
HttpMethod.POST,
|
||||
reqDTO,
|
||||
PpStatusResponse.class,
|
||||
headerMap
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String test() {
|
||||
final List<ElecnoticeDTO.Elecnoticemst> tgtList = mapper2.selectElecnoticemst();
|
||||
|
||||
if(tgtList == null) System.out.println("1");
|
||||
return "test";
|
||||
}
|
||||
}
|
@ -0,0 +1,61 @@
|
||||
package kr.xit.ens.pplus.web;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import kr.xit.biz.ens.model.cmm.SndngMssageParam;
|
||||
import kr.xit.biz.ens.model.pplus.PplusDTO.PpCommonResponse;
|
||||
import kr.xit.biz.ens.model.pplus.PplusDTO.PpStatusRequest;
|
||||
import kr.xit.biz.ens.model.pplus.PplusDTO.PpStatusResponse;
|
||||
import kr.xit.core.model.ApiResponseDTO;
|
||||
import kr.xit.core.model.IApiResponse;
|
||||
import kr.xit.ens.pplus.service.IPplusService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
*
|
||||
* packageName : kr.xit.ens.pplus.web
|
||||
* fileName : PplusController
|
||||
* author : limju
|
||||
* date : 2023-10-04
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2023-10-04 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Tag(name = "PplusController", description = "Postplus(포스토피아) API")
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/api/ens/pplus/v1")
|
||||
public class PplusController {
|
||||
private final IPplusService service;
|
||||
|
||||
@Operation(summary = "우편제작접수", description = "우편제작접수 요청<br><a href='/pstFile.html'>우편제작접수</a>")
|
||||
@PostMapping(value = "/accept", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public IApiResponse send(@ModelAttribute final SndngMssageParam paramDTO) {
|
||||
PpCommonResponse resDTO = service.sendBulks(paramDTO);
|
||||
return ApiResponseDTO.success(resDTO);
|
||||
}
|
||||
|
||||
@Operation(summary = "우편제작 상태 조회", description = "우편제작상태조회")
|
||||
@PostMapping(value = "/status", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public IApiResponse status(@RequestBody final PpStatusRequest paramDTO) {
|
||||
PpStatusResponse resDTO = service.statusBulks(paramDTO);
|
||||
return ApiResponseDTO.success(resDTO);
|
||||
}
|
||||
@Operation(summary = "테스트", description = "테스트")
|
||||
@PostMapping(value = "/test", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
public IApiResponse test() {
|
||||
String msg = service.test();
|
||||
return ApiResponseDTO.success(msg);
|
||||
}
|
||||
}
|
@ -1,119 +0,0 @@
|
||||
#-----------------------------------------------------------------------
|
||||
# local 설정
|
||||
#-----------------------------------------------------------------------
|
||||
spring:
|
||||
# //FIXME:: SSL 활성화시 코멘트 제거
|
||||
# profiles:
|
||||
# include:
|
||||
# - https
|
||||
datasource:
|
||||
hikari:
|
||||
# 9 server
|
||||
primary:
|
||||
database: oracle
|
||||
driver-class-name: oracle.jdbc.OracleDriver
|
||||
jdbc-url: jdbc:oracle:thin:@211.119.124.117:1521:ora11g
|
||||
username: xit_traffic
|
||||
password: traffic5
|
||||
pool-name: xit-oracle-pool
|
||||
|
||||
devtools:
|
||||
restart:
|
||||
enabled: true
|
||||
additional-exclude: static/**,public/**
|
||||
livereload:
|
||||
enabled: true
|
||||
|
||||
springdoc:
|
||||
api-docs:
|
||||
enabled: true
|
||||
swagger-ui:
|
||||
enabled: true
|
||||
|
||||
logging:
|
||||
level:
|
||||
root: debug
|
||||
org.apache.http: warn
|
||||
io.netty: warn
|
||||
reactor.netty: WARN
|
||||
# webclient logging
|
||||
reactor.netty.http.client: DEBUG
|
||||
#org.springframework.web.reactive.function.client.ExchangeFunctions: TRACE
|
||||
org.springframework: warn
|
||||
org.hibernate.validator.internal: WARN
|
||||
file:
|
||||
# 로그파일 위치
|
||||
path: ${app.data.root.path}/mens/logs
|
||||
name: ${app.name}
|
||||
|
||||
# ==================================================================================================================
|
||||
# SQL logging lib setting
|
||||
# ==================================================================================================================
|
||||
decorator:
|
||||
datasource:
|
||||
p6spy:
|
||||
enable-logging: true
|
||||
|
||||
app:
|
||||
api-ip: 211.119.124.73
|
||||
# 강제로 swagger-url을 지정해야 하는 경우만 선언
|
||||
#swagger-url: 'http://localhost:${server.port}${server.servlet.context-path:}/'
|
||||
# Spring Security cors 설정 :: CorsConfiguration 설정 값
|
||||
cors:
|
||||
allowed-origins: http://localhost:8080, http://${app.api-ip}:8080, http://localhost:8082, http://${app.api-ip}:8082
|
||||
|
||||
data:
|
||||
root:
|
||||
#path: /Users/minuk/data
|
||||
path: d:/data
|
||||
|
||||
#---------------------------------------------------------------
|
||||
# log 설정
|
||||
# request:
|
||||
# custom-enabled | common-enabled | filter-enabled 중 1개만 활성화
|
||||
# --> 운영: common-enabled, 개발: custom-enabled 사용 권장
|
||||
# response-enabled : 호출 결과 출력 - 운영시 false
|
||||
# mdc : api 호출(서비스) 로그 기록
|
||||
# uris : api 호출 로그 제외 패턴
|
||||
#---------------------------------------------------------------
|
||||
log:
|
||||
request:
|
||||
custom-enabled: true
|
||||
response-enabled: true
|
||||
# MDC logging trace 활성
|
||||
mdc:
|
||||
enabled: true
|
||||
|
||||
# slack
|
||||
slack-webhook:
|
||||
enabled: false
|
||||
url: https://hooks.slack.com/services/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
|
||||
|
||||
contract:
|
||||
# milisecond
|
||||
connection:
|
||||
timeout: 60000
|
||||
readTimeout: 60000
|
||||
|
||||
kt:
|
||||
# vpn 사용
|
||||
#host: http://172.16.0.13:10210/ONLWeb
|
||||
host: http://211.43.10.163:10210/ONLWeb
|
||||
|
||||
kakao:
|
||||
api:
|
||||
talk:
|
||||
host: http://localhost:18080
|
||||
send: /pxy/kkoNew/v1/envelopes/{PRODUCT_CODE}T;POST
|
||||
bulksend: /pxy/kkoNew/v1/bulk/envelopes/{PRODUCT_CODE}T;POST
|
||||
validToken: /pxy/kkoNew/v1/envelopes/{ENVELOPE_ID}/tokens/{TOKEN}/verify;GET
|
||||
modifyStatus: /pxy/kkoNew/v1/envelopes/{ENVELOPE_ID}/read;POST
|
||||
bulkstatus: /pxy/kkoNew/v1/envelopes/status;POST
|
||||
pay:
|
||||
host: http://localhost:18080
|
||||
send: /pxy/kkost/v1/documents;POST
|
||||
bulksend: /pxy/kkost/v1/documents/bulk;POST
|
||||
validToken: /pxy/kkost/v1/{document_binder_uuid}/tokens/{tokens};GET
|
||||
modifyStatus: /pxy/kkost/v1/documents/{document_binder_uuid};POST
|
||||
bulkstatus: /pxy/kkost/v1/documents/bulk/status;POST
|
||||
findStatus: /pxy/kkost/v1/documents/{document_binder_uuid}/status;GET
|
@ -1,107 +0,0 @@
|
||||
#-----------------------------------------------------------------------
|
||||
# local 설정
|
||||
#-----------------------------------------------------------------------
|
||||
spring:
|
||||
# profiles:
|
||||
# include:
|
||||
# - https
|
||||
datasource:
|
||||
hikari:
|
||||
# 9 server
|
||||
primary:
|
||||
database: mysql
|
||||
driver-class-name: org.mariadb.jdbc.Driver
|
||||
jdbc-url: jdbc:mariadb://211.119.124.117:53306/ens?useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true&autoReconnect=true
|
||||
username: ens
|
||||
password: xit5811807
|
||||
pool-name: xit-maria-pool
|
||||
|
||||
devtools:
|
||||
restart:
|
||||
enabled: true
|
||||
additional-exclude: static/**,public/**
|
||||
livereload:
|
||||
enabled: true
|
||||
|
||||
springdoc:
|
||||
api-docs:
|
||||
enabled: true
|
||||
swagger-ui:
|
||||
enabled: true
|
||||
|
||||
logging:
|
||||
level:
|
||||
root: debug
|
||||
org.apache.http: warn
|
||||
io.netty: warn
|
||||
reactor.netty: WARN
|
||||
# webclient logging
|
||||
reactor.netty.http.client: DEBUG
|
||||
#org.springframework.web.reactive.function.client.ExchangeFunctions: TRACE
|
||||
org.springframework: warn
|
||||
org.hibernate.validator.internal: WARN
|
||||
file:
|
||||
# 로그파일 위치
|
||||
path: ${app.data.root.path}/mens/logs
|
||||
name: ${app.name}
|
||||
|
||||
# ==================================================================================================================
|
||||
# SQL logging lib setting
|
||||
# ==================================================================================================================
|
||||
decorator:
|
||||
datasource:
|
||||
p6spy:
|
||||
enable-logging: true
|
||||
|
||||
app:
|
||||
api-ip: 211.119.124.73
|
||||
# 강제로 swagger-url을 지정해야 하는 경우만 선언
|
||||
#swagger-url: 'http://localhost:${server.port}${server.servlet.context-path:}/'
|
||||
# Spring Security cors 설정 :: CorsConfiguration 설정 값
|
||||
cors:
|
||||
allowed-origins: http://localhost:8082, https://localhost:9443, http://${app.api-ip}:8082, http://${app.api-ip}:9443
|
||||
|
||||
data:
|
||||
root:
|
||||
#path: /Users/minuk/data
|
||||
path: d:/data
|
||||
|
||||
#---------------------------------------------------------------
|
||||
# log 설정
|
||||
# request:
|
||||
# custom-enabled | common-enabled | filter-enabled 중 1개만 활성화
|
||||
# --> 운영: common-enabled, 개발: custom-enabled 사용 권장
|
||||
# response-enabled : 호출 결과 출력 - 운영시 false
|
||||
# mdc : api 호출(서비스) 로그 기록
|
||||
# uris : api 호출 로그 제외 패턴
|
||||
#---------------------------------------------------------------
|
||||
log:
|
||||
request:
|
||||
custom-enabled: true
|
||||
response-enabled: true
|
||||
# MDC logging trace 활성
|
||||
mdc:
|
||||
enabled: true
|
||||
|
||||
# slack
|
||||
slack-webhook:
|
||||
enabled: false
|
||||
url: https://hooks.slack.com/services/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
|
||||
|
||||
contract:
|
||||
# milisecond
|
||||
connection:
|
||||
timeout: 60000
|
||||
readTimeout: 60000
|
||||
|
||||
kt:
|
||||
# vpn 사용
|
||||
#host: http://172.16.0.13:10210/ONLWeb
|
||||
host: http://211.43.10.163:10210/ONLWeb
|
||||
|
||||
kakao:
|
||||
api:
|
||||
talk:
|
||||
host: https://test-edoc-gw.kakao.com
|
||||
send: /v1/envelopes/{PRODUCT_CODE}T;POST
|
||||
bulksend: /v1/bulk/envelopes/{PRODUCT_CODE}T;POST
|
@ -1,73 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="kr.xit.biz.cmm.mapper.ICmmEnsCacheMapper">
|
||||
|
||||
<select id="selectNiceCiInfo" resultType="kr.xit.biz.ens.model.nice.NiceCiDTO$NiceCiInfo">
|
||||
/** ens-cmm-cache-oracle-mapper|selectNiceCiInfo-Nice인증정보조회|julim */
|
||||
SELECT signgu_code, /* 시군구코드 */
|
||||
ffnlg_code, /* 과태료코드 */
|
||||
client_id, /* nice client id */
|
||||
client_secret, /* app security code */
|
||||
product_id, /* 상품 코드 */
|
||||
access_token, /* access token */
|
||||
expires_in, /* access token 만료일시(초)*/
|
||||
token_type, /* token type */
|
||||
scope, /* token scope */
|
||||
site_code, /* 공개키 사이트 코드 */
|
||||
key_version, /* 공개키 버전 */
|
||||
public_key, /* 공개키 */
|
||||
TO_CHAR(TO_DATE(valid_dtim, 'YYYYMMDDHH24MISS') - INTERVAL '1' HOUR, 'YYYYMMDDHH24MISS') AS validDtim, /* 공개키 만료일시 */
|
||||
cur_symkey_version, /* 현재 대칭키 버전 */
|
||||
TO_CHAR(TO_DATE(cur_symkey_valid_dtim, 'YYYYMMDDHH24MISS') - INTERVAL '1' HOUR, 'YYYYMMDDHH24MISS') AS curSymkeyValidDtim, /* 현재 대칭키 만료일시 */
|
||||
cur_symkey_key, /* 현재 대칭키 - key */
|
||||
cur_symkey_iv, /* 현재 대칭키 - iv */
|
||||
cur_symkey_hmac_key, /* 현재 대칭키 - hmac_key */
|
||||
bef_symkey_version, /* 이전 대칭키 버전 */
|
||||
bef_symkey_valid_dtim, /* 이전 대칭키 만료일시 */
|
||||
bef_symkey_key, /* 이전 대칭키 - key */
|
||||
bef_symkey_iv, /* 이전 대칭키 - iv */
|
||||
bef_symkey_hmac_key /* 이전 대칭키 - hmac_key */
|
||||
FROM tb_cmm_nice_instn_crtf_info
|
||||
WHERE signgu_code = #{signguCode}
|
||||
AND ffnlg_code = #{ffnlgCode}
|
||||
</select>
|
||||
|
||||
<select id="selectEnsRlaybsnmInfo" resultType="kr.xit.biz.ens.model.cmm.CmmEnsRlaybsnmDTO">
|
||||
/** ens-cmm-cache-oracle-mapper|selectEnsRlaybsnmInfo-중계사업관리자정보조회|julim */
|
||||
SELECT signgu_code, /* 시군구코드 */
|
||||
ffnlg_code, /* 과태료코드 */
|
||||
signgu_nm, /* 시군구 명 */
|
||||
ffnlg_nm, /* 과태료 명 */
|
||||
kakao_client_id, /* 카카오 Client ID */
|
||||
kakao_product_cd, /* 카카오 상품 코드 */
|
||||
kakao_access_token, /* 카카오 access token */
|
||||
kakao_contract_uuid, /* 카카오 contract uuid */
|
||||
kakao_partner_rest_api_key, /* 카카오 partner key */
|
||||
kakao_dealer_rest_api_key, /* 카카오 dealer key */
|
||||
CASE WHEN #{profile} = 'prod' THEN kakao_prod_settle_id ELSE kakao_dev_settle_id END AS kakaoSettleId, /* 카카오 settle id */
|
||||
kt_client_id, /* KT client id */
|
||||
kt_client_tp, /* KT client tp */
|
||||
kt_scope, /* KT scope */
|
||||
kt_service_code, /* KT service code */
|
||||
CASE WHEN #{profile} = 'prod' THEN kt_prod_client_id ELSE kt_dev_client_id END AS ktSvcClientId, /* KT client service ID */
|
||||
CASE WHEN #{profile} = 'prod' THEN kt_prod_client_secret ELSE kt_dev_client_secret END AS ktSvcClientSecret, /* KT client service secret */
|
||||
CASE WHEN #{profile} = 'prod' THEN kt_prod_service_cerf_key ELSE kt_dev_service_cerf_key END AS ktSvcCerfKey, /* KT client service cerf key */
|
||||
CASE WHEN #{profile} = 'prod' THEN kt_prod_access_token ELSE kt_dev_access_token END AS ktAccessToken, /* KT access token */
|
||||
CASE WHEN #{profile} = 'prod' THEN kt_prod_token_jti ELSE kt_dev_token_jti END AS ktTokenJti, /* KT 토큰 식별자 */
|
||||
CASE WHEN NVL(CASE WHEN #{profile} = 'prod' THEN kt_prod_token_expires_in ELSE kt_dev_token_expires_in END, '') = ''
|
||||
THEN NULL
|
||||
ELSE updt_dt + (CASE WHEN #{profile} = 'prod' THEN kt_prod_token_expires_in ELSE kt_dev_token_expires_in END - 86400) / 86400
|
||||
END AS ktTokenExpiresIn, /* KT 토큰 유효기간 : (7775999)(90일) */
|
||||
epost_service_key, /* epost service key */
|
||||
pplus_api_key, /* postplus api key */
|
||||
sender_nm, /* 발송인 명 */
|
||||
sender_zip_no, /* 발송인 우편 번호 */
|
||||
sender_addr, /* 발송인 주소 */
|
||||
sender_detail_addr /* 발송인 상세 주소 */
|
||||
FROM tb_ens_rlaybsnm_manage
|
||||
WHERE signgu_code = #{signguCode}
|
||||
AND ffnlg_code = #{ffnlgCode}
|
||||
</select>
|
||||
|
||||
</mapper>
|
@ -1,97 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="kr.xit.biz.ktgbs.mapper.IBizKtGbsMapper">
|
||||
|
||||
<update id="updateRlaybsnmKtBcInfo" parameterType="kr.xit.biz.ens.model.cmm.CmmEnsRlaybsnmDTO">
|
||||
/** ens-kt-oracle-mapper|updateRlaybsnmKtBcInfo-kt BC token 정보 갱신|julim */
|
||||
UPDATE tb_ens_rlaybsnm_manage
|
||||
SET kt_scope = #{ktScope},
|
||||
<choose>
|
||||
<when test="profile eq 'prod'">
|
||||
kt_prod_access_token = #{ktAccessToken},
|
||||
kt_prod_token_expires_in = #{ktTokenExpiresIn},
|
||||
kt_prod_token_jti = #{ktTokenJti},
|
||||
</when>
|
||||
<otherwise>
|
||||
kt_dev_access_token = #{ktAccessToken},
|
||||
kt_dev_token_expires_in = #{ktTokenExpiresIn},
|
||||
kt_dev_token_jti = #{ktTokenJti},
|
||||
</otherwise>
|
||||
</choose>
|
||||
updt_dt = sysdate,
|
||||
updusr = 'api-biz'
|
||||
WHERE signgu_code = #{signguCode}
|
||||
AND ffnlg_code = #{ffnlgCode}
|
||||
</update>
|
||||
|
||||
<update id="updateRlaybsnmKtGbsInfo" parameterType="kr.xit.biz.ens.model.cmm.CmmEnsRlaybsnmDTO">
|
||||
/** ens-kt-oracle-mapper|updateRlaybsnmKtGbsInfo-kt GIBIS token 정보 갱신|julim */
|
||||
UPDATE tb_ens_rlaybsnm_manage
|
||||
SET
|
||||
<choose>
|
||||
<when test="profile eq 'prod'">
|
||||
kt_prod_access_token = #{ktAccessToken},
|
||||
</when>
|
||||
<otherwise>
|
||||
kt_dev_access_token = #{ktAccessToken},
|
||||
</otherwise>
|
||||
</choose>
|
||||
updt_dt = sysdate,
|
||||
updusr = 'api-biz'
|
||||
WHERE signgu_code = #{signguCode}
|
||||
AND ffnlg_code = #{ffnlgCode}
|
||||
</update>
|
||||
|
||||
<update id="updateKtGbsDtl" parameterType="kr.xit.biz.ens.model.ktgbs.KtGbsDTO$MsgRsltReqsData">
|
||||
/** ens-kt-oracle-mapper|updateKtGbsDtl-kt GIBIS 메세지 수신결과 상세 반영|julim */
|
||||
UPDATE tb_ens_kt_gbs
|
||||
SET mms_sndg_rslt_sqno = #{mmsSndgRsltSqno} /* MMS 발송 결과 상태 순번 - 1:수신시, 2:발송시*/
|
||||
, prcs_dt = #{prcsDt} /* 처리일자 */
|
||||
, mbl_bzowr_dvcd = #{mblBzowrDvcd} /* 모바일 사업자 구분 : 01:KT, 02:SKT, 03:LGT */
|
||||
, rl_mms_sndg_telno = #{rlMmsSndgTelno} /* 실제 발송 번호 */
|
||||
, mms_rslt_dvcd = #{mmsRsltDvcd} /* 발송결과코드 */
|
||||
, mms_sndg_tmst = NVL(#{mmsSndgTmst}, mms_sndg_tmst) /* 발송 타임 스탬프 */
|
||||
, mms_rcv_tmst = NVL(#{mmsRcvTmst}, mms_rcv_tmst) /* 수신 타임 스탬프 */
|
||||
, mms_rdg_tmst = NVL(#{mmsRdgTmst}, mms_rdg_tmst) /* 열람 타임 스탬프 */
|
||||
, updt_dt = sysdate
|
||||
, updusr = 'api_inbound'
|
||||
WHERE src_key = #{srcKey}
|
||||
</update>
|
||||
|
||||
<insert id="saveKtGbsCntcSndngResult" parameterType="kr.xit.biz.ens.model.ktgbs.KtGbsDTO$MsgRsltReqsData">
|
||||
/** ens-kt-oracle-mapper|saveKtGbsCntcSndngResult-KT GIBIS 연계발송결과반영|julim */
|
||||
MERGE INTO tb_elctrn_ntic_sndng_result tensr
|
||||
USING (SELECT unity_sndng_detail_id FROM tb_ens_kt_gbs WHERE src_key = #{srcKey}) tekg
|
||||
ON (tensr.elctrn_ntic_sndng_detail_id = tekg.unity_sndng_detail_id)
|
||||
WHEN MATCHED THEN
|
||||
UPDATE
|
||||
SET sndng_result_sttus = NVL(#{mmsRsltDvcd}, sndng_result_sttus)
|
||||
, requst_dt = NVL(#{mmsSndgTmst}, requst_dt) /* 송신(요청) 일시 */
|
||||
, inqire_dt = NVL(#{mmsRcvTmst}, inqire_dt) /* 수신(조회) 일시 */
|
||||
, readng_dt = NVL(#{mmsRdgTmst}, readng_dt) /* 최초열람일시 */
|
||||
, last_updt_dt = sysdate
|
||||
WHEN NOT MATCHED THEN
|
||||
INSERT (
|
||||
elctrn_ntic_sndng_detail_id, /* 통합 발송 상세 ID*/
|
||||
sndng_se, /* 발송구분코드 - KAKAO-NEW|KT-GBS */
|
||||
sndng_result_sttus, /* 발송결과상태 */
|
||||
requst_dt, /* 송신(요청) 일시 */
|
||||
inqire_dt, /* 수신(조회) 일시 */
|
||||
readng_dt, /* 최초열람일시 */
|
||||
error_cn, /* 에러내용 */
|
||||
regist_dt,
|
||||
register
|
||||
) VALUES (
|
||||
(SELECT tekg.unity_sndng_detail_id FROM tb_ens_kt_gbs tekg WHERE tekg.src_key = #{srcKey})
|
||||
, 'ktGibis'
|
||||
, #{mmsRsltDvcd} /* 발송결과상태 */
|
||||
, #{mmsSndgTmst} /* 송신(요청) 일시 */
|
||||
, #{mmsRcvTmst} /* 수신(조회) 일시 */
|
||||
, #{mmsRdgTmst} /* 최초열람일시 */
|
||||
, '' /* 에러내용 */
|
||||
, sysdate
|
||||
, 'api_inbound'
|
||||
)
|
||||
</insert>
|
||||
</mapper>
|
@ -1,56 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="kr.xit.biz.mbl.mapper.IMobilePageMapper">
|
||||
|
||||
<select id="selectKkopayMobilePage" resultType="kr.xit.biz.mbl.model.MobilePageDTO$MobilePageManage">
|
||||
/** ens-mbl-oracle-mapper|selectKkopayMobilePage-카카오페이 모바일 페이지 콘텐트 조회|julim */
|
||||
SELECT tempm.sndng_detail_id
|
||||
, tempm.sndng_se_code
|
||||
, tempm.mobile_page_cn
|
||||
, tekmd.signgu_code
|
||||
, tekmd.ffnlg_code
|
||||
FROM tb_ens_kakao_my_doc tekmd
|
||||
JOIN tb_ens_mobile_page_manage tempm
|
||||
ON tekmd.sndng_detail_id = tempm.sndng_detail_id
|
||||
WHERE tekmd.external_document_uuid = #{external_document_uuid}
|
||||
AND tekmd.document_binder_uuid = #{document_binder_uuid}
|
||||
</select>
|
||||
|
||||
<select id="selectKkotalkMobilePage" resultType="kr.xit.biz.mbl.model.MobilePageDTO$MobilePageManage">
|
||||
/** ens-mbl-oracle-mapper|selectKkotalkMobilePage-카카오톡 모바일 페이지 콘텐트 조회|julim */
|
||||
SELECT tempm.sndng_detail_id
|
||||
, tempm.sndng_se_code
|
||||
, tempm.mobile_page_cn
|
||||
, tekmd.signgu_code
|
||||
, tekmd.ffnlg_code
|
||||
FROM tb_ens_kakao_d10 tekmd
|
||||
JOIN tb_ens_mobile_page_manage tempm
|
||||
ON tekmd.sndng_detail_id = tempm.sndng_detail_id
|
||||
WHERE tekmd.envelope_id = #{envelopeId}
|
||||
AND tekmd.external_id = #{externalId}
|
||||
</select>
|
||||
|
||||
<select id="selectKtBcMobilePage" resultType="kr.xit.biz.mbl.model.MobilePageDTO$MobilePageManage">
|
||||
/** ens-mbl-oracle-mapper|selectKtBcMobilePage-KT BC 모바일 페이지 콘텐트 조회|julim */
|
||||
SELECT tempm.sndng_detail_id
|
||||
, tempm.sndng_se_code
|
||||
, tempm.mobile_page_cn
|
||||
FROM tb_ens_kt_bc_detail tekbd
|
||||
JOIN tb_ens_mobile_page_manage tempm
|
||||
ON tekbd.sndng_detail_id = tempm.sndng_detail_id
|
||||
WHERE tekbd.src_key = #{srcKey}
|
||||
</select>
|
||||
|
||||
|
||||
<select id="selectKtGbsMobilePage" resultType="kr.xit.biz.mbl.model.MobilePageDTO$MobilePageManage">
|
||||
/** ens-mbl-mysql-mapper|selectKtGbsMobilePage-KT GIBIS 모바일 페이지 콘텐트 조회|julim */
|
||||
SELECT tempm.sndng_detail_id
|
||||
, tempm.sndng_se_code
|
||||
, tempm.mobile_page_cn
|
||||
FROM tb_ens_kt_gbs tekg
|
||||
JOIN tb_ens_mobile_page_manage tempm
|
||||
ON tekg.sndng_detail_id = tempm.sndng_detail_id
|
||||
WHERE tekg.src_key = #{srcKey}
|
||||
</select>
|
||||
</mapper>
|
@ -1,51 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="kr.xit.biz.nice.mapper.IBizNiceCiMapper">
|
||||
|
||||
<update id="updateNiceCrtfToken" parameterType="kr.xit.biz.ens.model.nice.NiceCiDTO$NiceCiInfo">
|
||||
/** ens-nice-oracle-mapper|updateNiceCrtfToken-Nice token 정보 갱신|julim */
|
||||
UPDATE tb_cmm_nice_instn_crtf_info
|
||||
SET access_token = #{accessToken},
|
||||
token_type = #{tokenType},
|
||||
expires_in = #{expiresIn},
|
||||
scope = #{scope},
|
||||
updt_dt = sysdate,
|
||||
updusr = 'api-biz'
|
||||
WHERE signgu_code = #{signguCode}
|
||||
AND ffnlg_code = #{ffnlgCode}
|
||||
</update>
|
||||
|
||||
<update id="updateNiceCrtfPublickey" parameterType="kr.xit.biz.ens.model.nice.NiceCiDTO$NiceCiInfo">
|
||||
/** ens-nice-oracle-mapper|updateNiceCrtfPublickey-Nice publickey 인증정보 갱신|julim */
|
||||
UPDATE tb_cmm_nice_instn_crtf_info
|
||||
SET site_code = #{siteCode},
|
||||
key_version = #{keyVersion},
|
||||
public_key = #{publicKey},
|
||||
valid_dtim = #{validDtim},
|
||||
updt_dt = sysdate,
|
||||
updusr = 'api-biz'
|
||||
WHERE signgu_code = #{signguCode}
|
||||
AND ffnlg_code = #{ffnlgCode}
|
||||
</update>
|
||||
|
||||
<update id="updateNiceCrtfSymkey" parameterType="kr.xit.biz.ens.model.nice.NiceCiDTO$NiceCiInfo">
|
||||
/** ens-nice-oracle-mapper|updateNiceCrtfSymkey-Nice symkey 인증정보 갱신|julim */
|
||||
UPDATE tb_cmm_nice_instn_crtf_info
|
||||
SET cur_symkey_version = #{curSymkeyVersion},
|
||||
cur_symkey_valid_dtim = #{curSymkeyValidDtim},
|
||||
cur_symkey_key = #{curSymkeyKey},
|
||||
cur_symkey_iv = #{curSymkeyIv},
|
||||
cur_symkey_hmac_key = #{curSymkeyHmacKey},
|
||||
bef_symkey_version = #{befSymkeyVersion},
|
||||
bef_symkey_valid_dtim = #{befSymkeyValidDtim},
|
||||
bef_symkey_key = #{befSymkeyKey},
|
||||
bef_symkey_iv = #{befSymkeyIv},
|
||||
bef_symkey_hmac_key = #{befSymkeyHmacKey},
|
||||
updt_dt = sysdate,
|
||||
updusr = 'api-biz'
|
||||
WHERE signgu_code = #{signguCode}
|
||||
AND ffnlg_code = #{ffnlgCode}
|
||||
</update>
|
||||
|
||||
</mapper>
|
@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="kr.xit.ens.pplus.mapper.IPplusMapper">
|
||||
|
||||
<select id="selectPostPlusSendTgts" resultType="kr.xit.biz.ens.model.pplus.PplusDTO$BatchAcceptRequest">
|
||||
/** ens-pplus-mapper|selectPostPlusSendTgts-Post Plus 발송 대상 목록 조회|julim */
|
||||
SELECT tesm.unity_sndng_mastr_id
|
||||
, tesm.sndng_mastr_id
|
||||
, CASE WHEN tesm.try_seq = tesm.try_cnt THEN 'send-ok'
|
||||
ELSE concat('sending', try_seq)
|
||||
END AS sndngProcessSttus
|
||||
, tepp.sndng_detail_id
|
||||
, tepp.unity_sndng_detail_id
|
||||
, tepp.signgu_code
|
||||
, tepp.ffnlg_code
|
||||
, tepp.service_cd
|
||||
, tepp.con_key
|
||||
, teppj.master_cols
|
||||
, teppj.master_rows
|
||||
, teppj.detail_cols
|
||||
, teppj.detail_rows
|
||||
FROM tb_ens_sndng_mastr tesm
|
||||
JOIN tb_ens_post_plus tepp
|
||||
ON tesm.sndng_mastr_id=tepp.sndng_mastr_id
|
||||
AND tesm.signgu_code = tepp.signgu_code
|
||||
AND tesm.ffnlg_code = tepp.ffnlg_code
|
||||
JOIN tb_ens_post_plus_json teppj
|
||||
ON tepp.unity_sndng_detail_id = teppj.unity_sndng_detail_id
|
||||
AND tepp.con_key = teppj.con_key
|
||||
AND tepp.sn = teppj.sn
|
||||
WHERE tepp.sndng_mastr_id = #{sndngMastrId}
|
||||
AND tesm.signgu_code = #{signguCode}
|
||||
AND tesm.ffnlg_code = #{ffnlgCode}
|
||||
ORDER BY teppj.sn
|
||||
</select>
|
||||
|
||||
</mapper>
|
@ -0,0 +1,159 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="kr.xit.biz.sisul.mapper.IBizSisulMapper">
|
||||
|
||||
<select id="selectDeptInfoByTmplId" resultType="kr.xit.biz.ens.model.cmm.TmplatManage">
|
||||
/** ens-sysul-mysql-mapper|selectDeptInfoByTmplId-템플릿ID로 부서정보 조회|seojh */
|
||||
SELECT tetm.signgu_code
|
||||
, tetm.ffnlg_code
|
||||
, tetm.try1
|
||||
, tetm.post_dlvr_se
|
||||
, tetm.post_tmplat_code
|
||||
FROM tb_ens_tmplat_manage tetm
|
||||
WHERE tmplat_id = #{tmplatId}
|
||||
</select>
|
||||
|
||||
<insert id="insertCntcSndngMst">
|
||||
/** ens-sysul-mysql-mapper|insertCntcSndngMst-연계발송마스터 생성|seojh */
|
||||
INSERT
|
||||
INTO tb_cntc_sndng_mastr (
|
||||
unity_sndng_mastr_id, /* 통합발송마스터 id */
|
||||
signgu_code, /* 시군구코드 */
|
||||
ffnlg_code, /* 과태료코드 */
|
||||
tmplat_id, /* 템플릿ID */
|
||||
sndng_ty_code, /* 발송유형 코드 */
|
||||
sndng_co, /* 발송 건수 */
|
||||
sndng_process_sttus, /* 발송처리 상태 */
|
||||
sndng_dt, /* 발송일시 */
|
||||
clos_dt, /* 마감일시 */
|
||||
regist_dt,
|
||||
register
|
||||
)
|
||||
SELECT #{unitySndngMastrId}
|
||||
, tetm.signgu_code
|
||||
, tetm.ffnlg_code
|
||||
, tetm.tmplat_id
|
||||
, tetm.sndng_ty_code
|
||||
, #{sndngCo}
|
||||
, #{sndngProcessSttus}
|
||||
, #{sndngDt}
|
||||
, #{closDt}
|
||||
, now()
|
||||
, #{register}
|
||||
FROM tb_ens_tmplat_manage tetm
|
||||
WHERE tmplat_id = #{tmplatId}
|
||||
</insert>
|
||||
|
||||
<insert id="insertCntcSndngDtl">
|
||||
/** ens-sysul-mysql-mapper|insertCntcSndngDtl-연계발송상세 생성|seojh */
|
||||
INSERT
|
||||
INTO tb_cntc_sndng_detail (
|
||||
unity_sndng_detail_id, /* 통합발송 상세ID */
|
||||
unity_sndng_mastr_id, /* 통합발송 마스터ID */
|
||||
signgu_code, /* 시군구 코드 */
|
||||
ffnlg_code, /* 과태료 코드 */
|
||||
main_code, /* 메인 코드 - 자료 식별 코드 */
|
||||
tmplt_msg_data, /* 템플릿 메시지 데이터 - 가변 항목 자료 */
|
||||
mobile_page_cn, /* 모바일 페이지 내용 */
|
||||
use_instt_idntfc_id, /* 이용 기관 식별 ID - 교통시설 운영처 제목 가변 */
|
||||
regist_dt,
|
||||
register
|
||||
)
|
||||
SELECT #{unitySndngDetailId}
|
||||
, #{unitySndngMastrId}
|
||||
, tetm.signgu_code
|
||||
, tetm.ffnlg_code
|
||||
, #{mainCode}
|
||||
, #{tmpltMsgData}
|
||||
, #{mobilePageCn}
|
||||
, #{useInsttIdntfcId}
|
||||
, now()
|
||||
, #{register}
|
||||
FROM tb_ens_tmplat_manage tetm
|
||||
WHERE tmplat_id = #{tmplatId}
|
||||
</insert>
|
||||
|
||||
<insert id="insertCi">
|
||||
/** ens-sysul-mysql-mapper|insertCi-CI자료 생성|seojh */
|
||||
INSERT
|
||||
INTO tb_ens_ci (
|
||||
unity_sndng_detail_id,
|
||||
ci,
|
||||
result_cd,
|
||||
message,
|
||||
regist_dt,
|
||||
register
|
||||
) VALUES (
|
||||
#{unitySndngDetailId}
|
||||
, NVL(#{ci1}, #{ci2})
|
||||
, #{resultCd}
|
||||
, #{message}
|
||||
, now()
|
||||
, #{register}
|
||||
)
|
||||
</insert>
|
||||
<insert id="insertPostPlusJson">
|
||||
/** ens-sysul-mysql-mapper|insertPostPlusJson-포스트 플러스 json 생성|seojh */
|
||||
INSERT
|
||||
INTO tb_ens_post_plus_json(
|
||||
unity_sndng_detail_id,
|
||||
service_cd,
|
||||
con_key,
|
||||
sn,
|
||||
master_cols,
|
||||
master_rows,
|
||||
detail_cols,
|
||||
detail_rows,
|
||||
regist_dt,
|
||||
register
|
||||
) VALUES (
|
||||
#{unitySndngDetailId}
|
||||
, #{serviceCd}
|
||||
, #{conKey}
|
||||
, #{sn}
|
||||
, #{masterCols}
|
||||
, #{masterRows}
|
||||
, #{detailCols}
|
||||
, #{detailRows}
|
||||
, now()
|
||||
, #{register}
|
||||
)
|
||||
</insert>
|
||||
|
||||
|
||||
<select id="selectSndngResultMaster" resultType="kr.xit.biz.sisul.model.SisulSndngResultDTO$RsltSisulResMstData">
|
||||
/** ens-sysul-mysql-mapper|selectSndngResultMaster-발송결과정보 마스터 조회|julim */
|
||||
SELECT tesn.unity_sndng_mastr_id /* 통합발송마스터 ID - 파일유일키 */
|
||||
, tesn.sndng_se_code /* 발송구분코드 */
|
||||
, tesn.tmplat_id /* 템플릿 ID */
|
||||
, tesn.sndng_dt /* 발송일시 */
|
||||
, tesn.sndng_co /* 발송건수 */
|
||||
, tesn.sndng_process_sttus /* 발송처리 상태 */
|
||||
FROM tb_ens_sndng_mastr tesn
|
||||
WHERE tesn.unity_sndng_mastr_id = #{unitySndngMastrId}
|
||||
</select>
|
||||
|
||||
<select id="selectSndngResultDetails" resultType="kr.xit.biz.sisul.model.SisulSndngResultDTO$RsltSisulResDtlData">
|
||||
/** ens-sysul-mysql-mapper|selectSndngResultDetails-발송결과정보 상세 조회|julim */
|
||||
SELECT tesn.unity_sndng_mastr_id /* 통합발송마스터 ID - 파일유일키 */
|
||||
, tcsnd.unity_sndng_detail_id /* 통합발송상세 ID - 우편물 일련번호 */
|
||||
, tesn.sndng_se_code /* 발송구분코드 */
|
||||
, tesn.tmplat_id /* 템플릿 ID */
|
||||
, tcsr.requst_dt /* 발송일시 - sndngDt */
|
||||
, tcsr.inqire_dt /* 수신일시 - recvDt */
|
||||
, tcsr.readng_dt /* 열람일시 - readDt */
|
||||
, tcsr.rgist_no /* 등기번호 */
|
||||
, tcsr.sndng_result_sttus /* 발송결과상태 - resultCode */
|
||||
FROM tb_ens_sndng_mastr tesn
|
||||
JOIN tb_cntc_sndng_detail tcsnd
|
||||
ON tesn.unity_sndng_mastr_id = tcsnd.unity_sndng_mastr_id
|
||||
JOIN tb_cntc_sndng_result tcsr
|
||||
ON tcsnd.unity_sndng_detail_id = tcsr.unity_sndng_detail_id
|
||||
WHERE tesn.unity_sndng_mastr_id = #{unitySndngMastrId}
|
||||
<if test="unitySndngDetailId != null and unitySndngDetailId != ''">
|
||||
AND tcsr.unity_sndng_detail_id = #{unitySndngDetailId}
|
||||
</if>
|
||||
</select>
|
||||
|
||||
</mapper>
|
@ -1,80 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
|
||||
<mapper namespace="kr.xit.core.biz.mapper.IApiLoggingMapper">
|
||||
|
||||
<insert id="saveApiLogging" parameterType="kr.xit.core.biz.model.LoggingDTO">
|
||||
/** logging-oracle-mapper|saveApiLogging|julim */
|
||||
INSERT INTO tb_cmm_api_log (
|
||||
request_id
|
||||
, system_id
|
||||
, req_system_id
|
||||
, method
|
||||
, uri
|
||||
, param
|
||||
, ip
|
||||
, access_token
|
||||
, session_id
|
||||
, success
|
||||
, response
|
||||
, message
|
||||
, regist_dt
|
||||
, regist_id
|
||||
) VALUES (
|
||||
#{requestId}
|
||||
, #{systemId}
|
||||
, #{reqSystemId}
|
||||
, #{method}
|
||||
, #{uri}
|
||||
, #{param}
|
||||
, #{ip}
|
||||
, #{accessToken}
|
||||
, #{sessionId}
|
||||
, #{success}
|
||||
, #{response}
|
||||
, #{message}
|
||||
, sysdate
|
||||
, #{registId}
|
||||
)
|
||||
</insert>
|
||||
|
||||
<update id="updateApiLogging" parameterType="kr.xit.core.biz.model.LoggingDTO">
|
||||
/** logging-oracle-mapper|updateLogging|julim */
|
||||
UPDATE tb_cmm_api_log
|
||||
SET success = #{success}
|
||||
, response = #{response}
|
||||
, message = #{message}
|
||||
, updt_dt = sysdate
|
||||
, updt_id = #{updtId}
|
||||
WHERE request_id = #{requestId}
|
||||
</update>
|
||||
|
||||
<select id="selectApiLogging" resultType="kr.xit.core.biz.model.LoggingDTO">
|
||||
/** logging-oracle-mapper|selectApiLogging|julim */
|
||||
SELECT request_id
|
||||
, system_id
|
||||
, req_system_id
|
||||
, method
|
||||
, uri
|
||||
, param
|
||||
, ip
|
||||
, access_token
|
||||
, session_id
|
||||
, regist_dt
|
||||
, regist_id
|
||||
FROM tb_cmm_api_log
|
||||
<where>
|
||||
<if test='requestId != null and requestId != ""'>
|
||||
AND request_id = #{requestId}
|
||||
</if>
|
||||
<if test='systemId != null and systemId != ""'>
|
||||
AND system_id = #{systemId}
|
||||
</if>
|
||||
<if test='uri != null and uri != ""'>
|
||||
AND uri LIKE CONCAT('%', #{url}, '%')
|
||||
</if>
|
||||
</where>
|
||||
|
||||
</select>
|
||||
</mapper>
|
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="kr.xit.biz.other.mapper.IBizOtherMapper">
|
||||
|
||||
<select id="selectElecnoticemst" resultType="kr.xit.biz.other.model.ElecnoticeDTO$Elecnoticemst">
|
||||
/** ens-other-oracle-mapper|selectElecnoticemst-전자고지 파일 외부연계 마스터 조회|seojh */
|
||||
SELECT UNITYSNDNGMASTRID
|
||||
, SNDNGCO
|
||||
, SNDNGPROCESSSTTUS
|
||||
, INSUSER
|
||||
, INSDATE
|
||||
, UPDUSER
|
||||
, UPDDATE
|
||||
FROM ELECNOTICEMST
|
||||
</select>
|
||||
|
||||
</mapper>
|
@ -0,0 +1,10 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Error</p>
|
||||
</body>
|
||||
</html>
|
@ -1,14 +0,0 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Error</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Something went wrong</h1>
|
||||
<p>We're sorry, but something went wrong. Please try again later.</p>
|
||||
</body>
|
||||
</html>
|
@ -1,716 +0,0 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
|
||||
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
|
||||
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
|
||||
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
|
||||
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
|
||||
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
|
||||
<link rel="stylesheet" href="${ctx }/resource/css/style.css"/>
|
||||
<%-- <script src="https://cdn.jsdelivr.net/bxslider/4.2.12/jquery.bxslider.min.js"></script>--%>
|
||||
<%-- <link rel="stylesheet" href="https://cdn.jsdelivr.net/bxslider/4.2.12/jquery.bxslider.css"/>--%>
|
||||
<%-- <style>--%>
|
||||
<%-- .bx-wrapper ul.img-slider > li > a > img {--%>
|
||||
<%-- min-height: 30rem;--%>
|
||||
<%-- max-height: 45rem;--%>
|
||||
<%-- margin: auto;--%>
|
||||
<%-- }--%>
|
||||
<%-- .bx-wrapper ul.img-slider > li {--%>
|
||||
<%-- font-size: 1.5rem;--%>
|
||||
<%-- }--%>
|
||||
<%-- </style>--%>
|
||||
<script src="https://cdn.jsdelivr.net/npm/swiper/swiper-bundle.min.js"></script>
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper/swiper-bundle.min.css"/>
|
||||
<style>
|
||||
.swiper {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.swiper-slide {
|
||||
text-align: center;
|
||||
font-size: 18px;
|
||||
background: #fff;
|
||||
|
||||
/* Center slide text vertically */
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: -webkit-flex;
|
||||
display: flex;
|
||||
-webkit-box-pack: center;
|
||||
-ms-flex-pack: center;
|
||||
-webkit-justify-content: center;
|
||||
justify-content: center;
|
||||
-webkit-box-align: center;
|
||||
-ms-flex-align: center;
|
||||
-webkit-align-items: center;
|
||||
align-items: center;
|
||||
}
|
||||
.swiper-slide img {
|
||||
display: block;
|
||||
/*width: 100%;*/
|
||||
/*height: 100%;*/
|
||||
min-height: 30rem;
|
||||
max-height: 45rem;
|
||||
object-fit: cover;
|
||||
}
|
||||
.swiper-pagination-bullet {
|
||||
width: 2.5rem;
|
||||
height: 2.5rem;
|
||||
text-align: center;
|
||||
line-height: 2.3rem;
|
||||
font-size: 1.7rem;
|
||||
color: #000;
|
||||
opacity: 1;
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
.swiper-pagination-bullet-active {
|
||||
color: #fff;
|
||||
background: #007aff;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
|
||||
|
||||
<title>고지 출력</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="contents"></div>
|
||||
</body>
|
||||
|
||||
|
||||
<script>
|
||||
window.onload = () => {
|
||||
notRefresh();
|
||||
|
||||
let errCd = '${errCode}';
|
||||
let errMsg = '${errMsg}';
|
||||
let isEmpty = (val) => {
|
||||
if (val == null || val == undefined || val == '' || val == 'OK')
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
if (!isEmpty(errCd)) {
|
||||
alert('[' + errCd + ']' + errMsg);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
draw('contents');
|
||||
// $('.img-slider').bxSlider({
|
||||
// auto: false, // 자동으로 애니메이션 시작
|
||||
// speed: 500, // 애니메이션 속도
|
||||
// pause: 3000, // 애니메이션 유지 시간 (1000은 1초)
|
||||
// mode: 'horizontal', // 슬라이드 모드 ('fade', 'horizontal', 'vertical' 이 있음)
|
||||
// autoControls: true, // 시작 및 중지버튼 보여짐
|
||||
// pager: true, // 페이지 표시 보여짐
|
||||
// captions: true, // 이미지 위에 텍스트를 넣을 수 있음
|
||||
// });
|
||||
var swiper = new Swiper(".img-slider", {
|
||||
// slidesPerView: 3, //한페이지에 보여줄 이미지 갯수
|
||||
// spaceBetween: 30, //이미지간 간격
|
||||
// slidesPerGroup: 3, //페이지 그룹
|
||||
loop: true, //무한 루프
|
||||
zoom: true, //이미지 확대 여부(true:사용, false:미사용). 클래스 적용 필수 -> class="swiper-zoom-container"
|
||||
coverflowEffect: {
|
||||
rotate: 50,
|
||||
stretch: 0,
|
||||
depth: 100,
|
||||
modifier: 1,
|
||||
slideShadows: true,
|
||||
},
|
||||
pagination: {
|
||||
el: ".swiper-pagination",
|
||||
// type: "progressbar", //프로그래스바 타입 페이징
|
||||
clickable: true, //클릭가능 설정여부
|
||||
renderBullet: function (index, className) {
|
||||
return '<span class="' + className + '">' + (index + 1) + "</span>";
|
||||
},
|
||||
},
|
||||
navigation: {
|
||||
nextEl: ".swiper-button-next",
|
||||
prevEl: ".swiper-button-prev",
|
||||
},
|
||||
});
|
||||
|
||||
alinkNewWindow();
|
||||
}
|
||||
|
||||
/* ===============
|
||||
* a 태그
|
||||
=============== */
|
||||
var alinkNewWindow = () => {
|
||||
//link 연결 시 새창으로 열기
|
||||
document.querySelectorAll('a').forEach((elm, idx) => elm.target = '_new' + idx);
|
||||
}
|
||||
/* ===============
|
||||
* refresh 방지
|
||||
=============== */
|
||||
var notRefresh = () => {
|
||||
//모바일에서 스크롤을 끝까지 당겨 refresh 방지
|
||||
document.body.style.overscrollBehaviorY = 'none';
|
||||
//Url 에서 queryString 을 제거하여 재호출 방지
|
||||
history.pushState(null, null, location.origin + location.pathname);
|
||||
}
|
||||
/* ===============
|
||||
* 클립보드 복사
|
||||
=============== */
|
||||
var clipboardCopy = txt => {
|
||||
const textarea = document.createElement('textarea');
|
||||
document.body.appendChild(textarea);
|
||||
textarea.value = txt;
|
||||
textarea.select();
|
||||
document.execCommand("copy");
|
||||
textarea.remove();
|
||||
alert('클립보드로 복사 되었습니다.');
|
||||
}
|
||||
/* ===============
|
||||
* a 태그로 치환
|
||||
=============== */
|
||||
const accountPttrn = /\d{2,6}\-\d{2,9}(\-\d{2,9}\-\d{2,9}|\-\d{2,9})\s?\(?(KB|국민은행|국민|IBK|기업은행|기업|NH|농협은행|농협|WOORI|우리은행|우리|KEB|하나은행|하나|SHINHAN|신한은행|신한|CITY|씨티은행|씨티|DGB|대구은행|대구|BNK|부산은행|부산|SC|제일은행|제일|케이뱅크|카카오뱅크|카카오)?\)?/g;
|
||||
var pttrnAtagReplace = (txt, pttrn) => {
|
||||
let matches = txt.match(pttrn);
|
||||
if (matches == null) return txt;
|
||||
matches.forEach((str) => txt = txt.replace(str, '<a href="#" onclick="clipboardCopy(\'' + str.replace(/\n/g, '') + '\'); return false;">' + str + '</a>'));
|
||||
|
||||
return txt;
|
||||
}
|
||||
/* ===============
|
||||
* 강조문구 스타일 적용
|
||||
=============== */
|
||||
var highlightText = (txt, props) => {
|
||||
if (isEmpty(props.style)) return txt;
|
||||
if (isEmpty(props.style.highlight)) return txt;
|
||||
|
||||
for (let str in props.style.highlight) {
|
||||
let style = props.style.highlight[str];
|
||||
let span = document.createElement("span");
|
||||
span.innerText = str;
|
||||
if (!isEmpty(style['font-size'])) span.style.fontSize = style['font-size'];
|
||||
if (!isEmpty(style['font-color'])) span.style.color = style['font-color'];
|
||||
if (!isEmpty(style['font-weight'])) span.style.fontWeight = style['font-weight'];
|
||||
if (!isEmpty(style['font-style'])) span.style.fontStyle = style['font-style'];
|
||||
if (style['use-clipboard']) {
|
||||
span.classList.add('clipboard');
|
||||
span.style.cursor = 'pointer';
|
||||
span.style.textDecoration = 'underline';
|
||||
}
|
||||
|
||||
//정규식 기호로 인식되지 않도록 replace 처리
|
||||
str = str.replace(/\(/g, '\\(').replace(/\)/g, '\\)');
|
||||
str = str.replace(/\[/g, '\\[').replace(/\]/g, '\\]')
|
||||
|
||||
txt = txt.replace(new RegExp(str, 'g'), span.outerHTML);
|
||||
if (txt.indexOf(str) > -1 && style['use-copybutton']) {
|
||||
let btn = document.createElement('button');
|
||||
let btn_text = document.createTextNode('복사');
|
||||
btn.appendChild(btn_text);
|
||||
btn.setAttribute('type', 'button');
|
||||
btn.setAttribute('data-text', str);
|
||||
btn.classList.add('clipboard');
|
||||
btn.style.backgroundColor = '#4990e2';
|
||||
btn.style.color = 'white';
|
||||
btn.style.border = 'none';
|
||||
btn.style.marginLeft = '5px';
|
||||
txt = txt+btn.outerHTML;
|
||||
}
|
||||
}
|
||||
return txt;
|
||||
}
|
||||
/* ===============
|
||||
* XSS Filter 적용
|
||||
=============== */
|
||||
var escapeXml = (txt) => {
|
||||
if (isEmpty(txt)) return txt;
|
||||
|
||||
return txt.replace(/[<>&'"]/g, function (c) {
|
||||
switch (c) {
|
||||
case '<':
|
||||
return '<';
|
||||
case '>':
|
||||
return '>';
|
||||
case '&':
|
||||
return '&';
|
||||
case '\'':
|
||||
return ''';
|
||||
case '"':
|
||||
return '"';
|
||||
}
|
||||
});
|
||||
}
|
||||
/* ===============
|
||||
* 하이퍼링크 적용
|
||||
=============== */
|
||||
var hyperlink = (txt, props) => {
|
||||
if (isEmpty(props.hyperlink)) return txt;
|
||||
|
||||
props.hyperlink.forEach(url => {
|
||||
|
||||
let a = document.createElement('a');
|
||||
a.href = url;
|
||||
a.text = url;
|
||||
txt = txt.replace(new RegExp(url, 'g'), a.outerHTML);
|
||||
});
|
||||
|
||||
return txt;
|
||||
}
|
||||
|
||||
/* ===============
|
||||
* 데이터 출력
|
||||
=============== */
|
||||
var draw = (id) => {
|
||||
const jsonStr = '${details}'.replace(/\n/gi, '\\n').replace(/\r/gi, '\\r');
|
||||
var Dataset = JSON.parse(jsonStr);
|
||||
Dataset.details.forEach((row) => {
|
||||
switch (row.item_type) {
|
||||
case "TEXT":
|
||||
document.getElementById(id).innerHTML += text(row);
|
||||
break;
|
||||
case "PRE_TEXT":
|
||||
document.getElementById(id).innerHTML += pretext(row);
|
||||
break;
|
||||
case "KEY_VALUE":
|
||||
document.getElementById(id).innerHTML += keyvalue(row);
|
||||
break;
|
||||
case "TABLE":
|
||||
document.getElementById(id).innerHTML += table(row);
|
||||
break;
|
||||
case "IMAGE":
|
||||
document.getElementById(id).innerHTML += image(row);
|
||||
break;
|
||||
case "GRAPH":
|
||||
document.getElementById(id).innerHTML += graph(row);
|
||||
break;
|
||||
case "BUTTON":
|
||||
document.getElementById(id).innerHTML += button(row);
|
||||
break;
|
||||
case "PAY_BUTTON":
|
||||
document.getElementById(id).innerHTML += paybutton(row);
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
document.querySelectorAll('span.clipboard').forEach((ele) => {
|
||||
ele.addEventListener('click', function () {
|
||||
clipboardCopy(this.innerText);
|
||||
});
|
||||
});
|
||||
|
||||
document.querySelectorAll('button.clipboard').forEach((ele) => {
|
||||
ele.addEventListener('click', function () {
|
||||
clipboardCopy(this.dataset.text);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/* ===============
|
||||
* "Text" Type
|
||||
=============== */
|
||||
var text = (item) => {
|
||||
let props = isEmpty(item.properties) ? {} : item.properties;
|
||||
|
||||
//"title" Set
|
||||
var subject = props.use_toggle ? document.createElement('summary') : document.createElement('h2');
|
||||
subject.innerHTML = nvl(item.title, '');
|
||||
|
||||
//"text" Set
|
||||
var text = document.createElement('ul');
|
||||
item.elements.forEach((row) => {
|
||||
var span = document.createElement('li');
|
||||
// span.innerHTML = row;
|
||||
// span.innerHTML = pttrnAtagReplace(row, accountPttrn);
|
||||
// span.innerHTML = pttrnAtagReplace(highlightText(escapeXml(row), props), accountPttrn);
|
||||
span.innerHTML = highlightText(escapeXml(row), props);
|
||||
span.innerHTML = hyperlink(span.innerHTML, props);
|
||||
text.innerHTML += span.outerHTML;
|
||||
});
|
||||
|
||||
//<section> Set
|
||||
var section = document.createElement('section');
|
||||
section.className = 'text'; //섹션 클래스명
|
||||
section.innerHTML += isEmpty(subject.innerHTML) ? '' : subject.outerHTML;
|
||||
section.innerHTML += text.outerHTML;
|
||||
|
||||
//<details> Set
|
||||
if (props.use_toggle) {
|
||||
let details = document.createElement('details');
|
||||
details.innerHTML += section.innerHTML;
|
||||
section.innerHTML = details.outerHTML;
|
||||
}
|
||||
|
||||
|
||||
return section.outerHTML;
|
||||
}
|
||||
/* ===============
|
||||
* "Pre-Text" Type
|
||||
=============== */
|
||||
var pretext = (item) => {
|
||||
let props = isEmpty(item.properties) ? {} : item.properties;
|
||||
|
||||
//"title" Set
|
||||
var subject = props.use_toggle ? document.createElement('summary') : document.createElement('h2');
|
||||
subject.innerHTML = nvl(item.title, '');
|
||||
|
||||
//"text" Set
|
||||
var text = document.createElement('pre');
|
||||
// text.innerHTML = item.elements;
|
||||
// text.innerHTML = pttrnAtagReplace(item.elements, accountPttrn);
|
||||
// text.innerHTML = pttrnAtagReplace(highlightText(escapeXml(item.elements), props), accountPttrn);
|
||||
text.innerHTML = highlightText(escapeXml(item.elements), props);
|
||||
text.innerHTML = hyperlink(text.innerHTML, props);
|
||||
|
||||
//<section> Set
|
||||
var section = document.createElement('section');
|
||||
section.className = 'pretext'; //섹션 클래스명
|
||||
section.innerHTML += isEmpty(subject.innerHTML) ? '' : subject.outerHTML;
|
||||
section.innerHTML += text.outerHTML;
|
||||
|
||||
//<details> Set
|
||||
if (props.use_toggle) {
|
||||
let details = document.createElement('details');
|
||||
details.innerHTML += section.innerHTML;
|
||||
section.innerHTML = details.outerHTML;
|
||||
}
|
||||
|
||||
|
||||
return section.outerHTML;
|
||||
}
|
||||
/* ===============
|
||||
* "Key-Value" Type
|
||||
=============== */
|
||||
var keyvalue = (item) => {
|
||||
let props = isEmpty(item.properties) ? {} : item.properties;
|
||||
|
||||
//"title" Set
|
||||
var subject = props.use_toggle ? document.createElement('summary') : document.createElement('h2');
|
||||
subject.innerHTML = nvl(item.title, '');
|
||||
var table = document.createElement('table');
|
||||
|
||||
//<colgroup> Set
|
||||
table.innerHTML += createColgroup();
|
||||
|
||||
//<tbody> Set
|
||||
table.innerHTML += createBody(item.elements);
|
||||
|
||||
//<section> Set
|
||||
var section = document.createElement('section');
|
||||
section.className = 'keyvalue'; //섹션 클래스명
|
||||
section.innerHTML += isEmpty(subject.innerHTML) ? '' : subject.outerHTML;
|
||||
section.innerHTML += table.outerHTML;
|
||||
|
||||
//<details> Set
|
||||
if (props.use_toggle) {
|
||||
let details = document.createElement('details');
|
||||
details.innerHTML += section.innerHTML;
|
||||
section.innerHTML = details.outerHTML;
|
||||
}
|
||||
|
||||
//Create <colgroup>
|
||||
function createColgroup() {
|
||||
let colgroup = document.createElement('colgroup');
|
||||
let col1 = document.createElement('col');
|
||||
let col2 = document.createElement('col');
|
||||
col1.style = 'min-width: 180px;';
|
||||
col2.style = '';
|
||||
colgroup.innerHTML += col1.outerHTML;
|
||||
colgroup.innerHTML += col2.outerHTML;
|
||||
|
||||
return colgroup.outerHTML;
|
||||
}
|
||||
|
||||
//Create <tbody>
|
||||
function createBody(arr) {
|
||||
var tbody = document.createElement('tbody');
|
||||
arr.forEach((row) => {
|
||||
//<td> set - key, value
|
||||
var key = document.createElement('td');
|
||||
var value = document.createElement('td');
|
||||
value.style = 'text-align: left; padding-left: 20px;';
|
||||
key.innerHTML += row.key;
|
||||
// value.innerHTML += row.value;
|
||||
// value.innerHTML += pttrnAtagReplace(row.value, accountPttrn);
|
||||
// value.innerHTML = pttrnAtagReplace(highlightText(escapeXml(row.value), props), accountPttrn);
|
||||
value.innerHTML = highlightText(escapeXml(row.value), props);
|
||||
value.innerHTML = hyperlink(value.innerHTML, props);
|
||||
//<tr> set
|
||||
var tr = document.createElement('tr');
|
||||
tr.innerHTML += key.outerHTML;
|
||||
tr.innerHTML += value.outerHTML;
|
||||
//<tbody> append
|
||||
tbody.innerHTML += tr.outerHTML;
|
||||
});
|
||||
return tbody.outerHTML;
|
||||
}
|
||||
|
||||
|
||||
return section.outerHTML;
|
||||
}
|
||||
/* ===============
|
||||
* "Table" Type
|
||||
=============== */
|
||||
var table = (item) => {
|
||||
let props = isEmpty(item.properties) ? {} : item.properties;
|
||||
|
||||
//"title" Set
|
||||
var subject = props.use_toggle ? document.createElement('summary') : document.createElement('h2');
|
||||
subject.innerHTML = nvl(item.title, '');
|
||||
|
||||
//<table> Set
|
||||
var table = document.createElement('table');
|
||||
table.innerHTML += createHead(item.elements.head);
|
||||
table.innerHTML += createBody(item.elements.rows, props);
|
||||
|
||||
//<section> Set
|
||||
var section = document.createElement('section');
|
||||
section.className = 'table'; //섹션 클래스명
|
||||
section.innerHTML += isEmpty(subject.innerHTML) ? '' : subject.outerHTML;
|
||||
section.innerHTML += table.outerHTML;
|
||||
|
||||
//<details> Set
|
||||
if (props.use_toggle) {
|
||||
let details = document.createElement('details');
|
||||
details.innerHTML += section.innerHTML;
|
||||
section.innerHTML = details.outerHTML;
|
||||
}
|
||||
|
||||
//Create <thead>
|
||||
function createHead(arr) {
|
||||
var arrTxt = [];
|
||||
var thead = document.createElement('thead');
|
||||
var tr = document.createElement('tr');
|
||||
arr.forEach((row) => {
|
||||
var th = document.createElement('th');
|
||||
th.style = 'text-align: center;';
|
||||
th.innerHTML += row;
|
||||
tr.innerHTML += th.outerHTML;
|
||||
});
|
||||
thead.innerHTML += tr.outerHTML;
|
||||
return thead.outerHTML;
|
||||
}
|
||||
|
||||
//Create <tbody>
|
||||
function createBody(arr, properties) {
|
||||
//style...
|
||||
let styTextAlign = isEmpty(properties) || isEmpty(properties.style) || isEmpty(properties.style.text_align) ? [] : properties.style.text_align;
|
||||
|
||||
let tbody = document.createElement('tbody');
|
||||
arr.forEach((row) => {
|
||||
let tr = document.createElement('tr');
|
||||
row.forEach((value, idx) => {
|
||||
let td = document.createElement('td');
|
||||
td.style = 'text-align: ' + (styTextAlign[idx] == undefined ? 'center' : styTextAlign[idx]) + ';';
|
||||
// td.innerHTML += value;
|
||||
// td.innerHTML += pttrnAtagReplace(value, accountPttrn);
|
||||
// td.innerHTML += pttrnAtagReplace(highlightText(escapeXml(value), props), accountPttrn);
|
||||
td.innerHTML += highlightText(escapeXml(value), props);
|
||||
td.innerHTML = hyperlink(td.innerHTML, props);
|
||||
|
||||
tr.innerHTML += td.outerHTML;
|
||||
});
|
||||
tbody.innerHTML += tr.outerHTML;
|
||||
});
|
||||
return tbody.outerHTML;
|
||||
}
|
||||
|
||||
|
||||
return section.outerHTML;
|
||||
}
|
||||
/* ===============
|
||||
* "IMAGE" Type
|
||||
=============== */
|
||||
var image = (item) => {
|
||||
let props = isEmpty(item.properties) ? {} : item.properties;
|
||||
|
||||
//"title" Set
|
||||
var subject = props.use_toggle ? document.createElement('summary') : document.createElement('h2');
|
||||
subject.innerHTML = nvl(item.title, '');
|
||||
|
||||
|
||||
//<img> Set
|
||||
var div = document.createElement('div');
|
||||
if (item.print_type == 'SLIDE') //print_type이 슬라이드(SLIDE) 이면..
|
||||
div.innerHTML += createImgSlide(item.elements);
|
||||
else
|
||||
div.innerHTML += createImg(item.elements);
|
||||
|
||||
//<section> Set
|
||||
var section = document.createElement('section');
|
||||
section.className = 'image'; //섹션 클래스명
|
||||
section.innerHTML += isEmpty(subject.innerHTML) ? '' : subject.outerHTML;
|
||||
section.innerHTML += div.outerHTML;
|
||||
|
||||
//<details> Set
|
||||
if (props.use_toggle) {
|
||||
let details = document.createElement('details');
|
||||
details.innerHTML += section.innerHTML;
|
||||
section.innerHTML = details.outerHTML;
|
||||
}
|
||||
|
||||
//Create <img> Default
|
||||
function createImg(arr) {
|
||||
var arrTxt = [];
|
||||
arr.forEach((row) => {
|
||||
var img = document.createElement('img');
|
||||
img.alt = row.key;
|
||||
img.src = row.value;
|
||||
arrTxt.push(img.outerHTML);
|
||||
});
|
||||
|
||||
return arrTxt.join('<br/>');
|
||||
}
|
||||
|
||||
//Create <img> print Slider
|
||||
// function createImgSlide(arr) {
|
||||
// var ul = document.createElement('ul');
|
||||
// ul.className = 'img-slider';
|
||||
// arr.forEach((row) => {
|
||||
// var img = document.createElement('img');
|
||||
// img.title = row.key; //캡션 문구
|
||||
// img.alt = row.key;
|
||||
// img.src = row.value;
|
||||
// var a = document.createElement('a');
|
||||
// a.innerHTML = img.outerHTML;
|
||||
// var li = document.createElement('li');
|
||||
// li.innerHTML = a.outerHTML;
|
||||
// ul.innerHTML += li.outerHTML;
|
||||
// });
|
||||
//
|
||||
// return ul.outerHTML;
|
||||
// }
|
||||
function createImgSlide(arr) {
|
||||
let ul = document.createElement('ul');
|
||||
ul.className = 'swiper img-slider';
|
||||
|
||||
//이미지 Wrapper
|
||||
let imgWrapper = document.createElement('div');
|
||||
imgWrapper.className = 'swiper-wrapper';
|
||||
arr.forEach((row) => {
|
||||
let img = document.createElement('img');
|
||||
img.title = row.key; //캡션 문구
|
||||
img.alt = row.key;
|
||||
img.src = row.value;
|
||||
let zoomContainer = document.createElement('div');
|
||||
zoomContainer.className = 'swiper-zoom-container';
|
||||
zoomContainer.innerHTML = img.outerHTML;
|
||||
let div = document.createElement('div');
|
||||
div.className = 'swiper-slide';
|
||||
div.innerHTML = zoomContainer.outerHTML;
|
||||
imgWrapper.innerHTML += div.outerHTML;
|
||||
});
|
||||
ul.innerHTML += imgWrapper.outerHTML;
|
||||
|
||||
//페이징
|
||||
let pageNavBtnNext = document.createElement('div');
|
||||
let pageNavBtnPrev = document.createElement('div');
|
||||
let pageProgress = document.createElement('div');
|
||||
pageNavBtnNext.className = 'swiper-button-next';
|
||||
pageNavBtnPrev.className = 'swiper-button-prev';
|
||||
pageProgress.className = 'swiper-pagination';
|
||||
ul.innerHTML += pageNavBtnNext.outerHTML;
|
||||
ul.innerHTML += pageNavBtnPrev.outerHTML;
|
||||
ul.innerHTML += pageProgress.outerHTML;
|
||||
|
||||
return ul.outerHTML;
|
||||
}
|
||||
|
||||
return section.outerHTML;
|
||||
}
|
||||
/* ===============
|
||||
* "GRAPH" Type(예정)
|
||||
=============== */
|
||||
var graph = (item) => {
|
||||
}
|
||||
/* ===============
|
||||
* "BUTTON" Type
|
||||
=============== */
|
||||
var button = (item) => {
|
||||
//<button> Set
|
||||
var btn = createButton(item.title, item.link_url);
|
||||
|
||||
//<section> Set
|
||||
var section = document.createElement('section');
|
||||
section.className = 'button'; //섹션 클래스명
|
||||
section.innerHTML += btn.outerHTML;
|
||||
|
||||
//Create <button> Default
|
||||
function createButton(title, link_url) {
|
||||
let a = document.createElement('a');
|
||||
a.innerText = title;
|
||||
a.href = link_url;
|
||||
|
||||
let div = document.createElement('div');
|
||||
div.className = 'linkBtn';
|
||||
div.innerHTML = a.outerHTML;
|
||||
|
||||
|
||||
return div;
|
||||
}
|
||||
|
||||
return section.outerHTML;
|
||||
}
|
||||
/* ===============
|
||||
* "Pay-BUTTON" Type
|
||||
=============== */
|
||||
var paybutton = (item) => {
|
||||
let props = isEmpty(item.properties) ? {} : item.properties;
|
||||
|
||||
//<button> Set
|
||||
var btn = createButton(item.title);
|
||||
|
||||
//<section> Set
|
||||
var section = document.createElement('section');
|
||||
section.className = 'paybutton'; //섹션 클래스명
|
||||
section.innerHTML += btn.outerHTML;
|
||||
|
||||
//Create <button> Default
|
||||
function createButton(title) {
|
||||
let payButtonLinks = JSON.parse('${payButtonLinks}');
|
||||
let url = '';
|
||||
if (isEmpty(props.billSe))
|
||||
for (key in payButtonLinks) {
|
||||
url = payButtonLinks[key];
|
||||
break;
|
||||
}
|
||||
else
|
||||
url = payButtonLinks[props.billSe];
|
||||
|
||||
|
||||
let a = document.createElement('a');
|
||||
a.innerText = title;
|
||||
a.href = url;
|
||||
// a.target = '_blank';
|
||||
|
||||
let div = document.createElement('div');
|
||||
div.className = 'linkBtn';
|
||||
div.innerHTML = a.outerHTML;
|
||||
|
||||
|
||||
return div;
|
||||
}
|
||||
|
||||
return section.outerHTML;
|
||||
}
|
||||
|
||||
|
||||
var isEmpty = (val) => {
|
||||
if (val == null || val == undefined || val == '' || val == [] || val == {})
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
var nvl = (txt, replaceTxt) => {
|
||||
if (txt == null || txt == undefined || txt == '')
|
||||
return replaceTxt;
|
||||
return txt;
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
</html>
|
@ -1,171 +0,0 @@
|
||||
/*css*/
|
||||
*{
|
||||
padding:0;
|
||||
margin:0;
|
||||
-webkit-text-size-adjust : none; /* 크롬, 사파리, 오페라 신버전 */
|
||||
-ms-text-size-adjust : none; /* IE */
|
||||
-moz-text-size-adjust : none; /* 파이어폭스 */
|
||||
-o-text-size-adjust : none; /* 오페라 구버전 */
|
||||
}
|
||||
li{list-style:none;}
|
||||
img{border:none;}
|
||||
/*body {*/
|
||||
/* overscroll-behavior-y: none;*/
|
||||
/*}*/
|
||||
|
||||
/*웹폰트*/
|
||||
@font-face {
|
||||
font-family: 'notokr-bold';
|
||||
src: url('../font/notoKR-Bold/notokr-bold.eot');
|
||||
src: url('../font/notokr-bold/notokr-bold.eot?#iefix') format('embedded-opentype'),
|
||||
url('../font/notoKR-Bold/notokr-bold.woff2') format('woff2'),
|
||||
url('../font/notoKR-Bold/notokr-bold.woff') format('woff'),
|
||||
url('../font/notoKR-Bold/notoKR_Bold.ttf') format('truetype');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'notokr-medium';
|
||||
src: url('../font/notoKR-Medium/notokr-medium.eot');
|
||||
src: url('../font/notoKR-Medium/notokr-medium.eot?#iefix') format('embedded-opentype'),
|
||||
url('../font/notoKR-Medium/notokr-medium.woff2') format('woff2'),
|
||||
url('../font/notoKR-Medium/notokr-medium.woff') format('woff'),
|
||||
url('../font/notoKR-Medium/notokr-medium.ttf') format('truetype');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'notokr-regular';
|
||||
src: url('../font/notoKR-Regular/notokr-regular.eot');
|
||||
src: url('../font/notoKR-Regular/notokr-regular.eot?#iefix') format('embedded-opentype'),
|
||||
url('../font/notoKR-Regular/notokr-regular.woff2') format('woff2'),
|
||||
url('../font/notoKR-Regular/notokr-regular.woff') format('woff'),
|
||||
url('../font/notoKR-Regular/notokr-regular.ttf') format('truetype');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Nanumsquare_B";
|
||||
src: url("../font/nanumsquare/NanumSquare_acB.eot?") format("eot"),
|
||||
url("../font/nanumsquare/NanumSquare_acB.woff") format("woff"),
|
||||
url("../font/nanumsquare/NanumSquare_acB.ttf") format("truetype");
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
|
||||
|
||||
html{
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
#contents{
|
||||
border:0px solid red;
|
||||
width:100%;
|
||||
height:auto;
|
||||
padding: 20px 15px 60px 15px;
|
||||
}
|
||||
section{
|
||||
width:90%;
|
||||
height:auto;
|
||||
border:0px solid blue;
|
||||
margin:0 auto;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
/* border: 1px solid #444444; */
|
||||
border-collapse: collapse;
|
||||
border-top:2px solid #ccc;
|
||||
}
|
||||
th, td {
|
||||
border: 1px solid #ccc;
|
||||
padding: 10px;
|
||||
border-width: 1px 0px 1px 0px;
|
||||
font-family: 'notokr-regular';
|
||||
/*font-size:15px;*/
|
||||
font-size:2.5rem;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
li, pre, details {
|
||||
font-family: 'notokr-regular';
|
||||
font-size: 2.8rem;
|
||||
color: #6c6c6c;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
.keyvalue tr>td:nth-child(1){
|
||||
background:#f3f8ff;
|
||||
color:#50617a;
|
||||
font-family: 'notokr-bold';
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
.table tr th{
|
||||
background:#f3f8ff;
|
||||
color:#50617a;
|
||||
font-family: 'notokr-bold';
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
h2{
|
||||
font-family: 'notokr-bold';
|
||||
/*font-size:18px;*/
|
||||
font-size: 3.3rem;
|
||||
padding:10px 0px;
|
||||
background-image: url("../images/titleDeco.png");
|
||||
background-repeat: no-repeat;
|
||||
background-position:2px;
|
||||
padding-left:15px;
|
||||
}
|
||||
img{
|
||||
max-width:100%;
|
||||
}
|
||||
|
||||
/* 춘천 ens css 적용
|
||||
.image{
|
||||
height: 520px;
|
||||
padding-bottom: 80px;
|
||||
}
|
||||
*/
|
||||
|
||||
div.linkBtn{
|
||||
font-family: 'notokr-regular';
|
||||
font-size: 2.5rem;
|
||||
background-color: #4990e2;
|
||||
padding: 1.5rem 1rem 1.5rem 1rem;
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
border-radius: 0.5rem;
|
||||
margin-top: 10px;
|
||||
}
|
||||
div.linkBtn > a{
|
||||
text-decoration: auto;
|
||||
color: white;
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
|
||||
@media (max-width: 768px){
|
||||
#contents{
|
||||
height:auto;
|
||||
border:0px solid yellow;
|
||||
}
|
||||
h2{
|
||||
font-size:2.3rem;
|
||||
color:#333;
|
||||
}
|
||||
th, td {
|
||||
font-size:1.5rem;
|
||||
}
|
||||
li, pre, details {
|
||||
font-size:1.5rem;
|
||||
color: #6c6c6c;
|
||||
}
|
||||
div.linkBtn{
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
}/*삭제조심*/
|
Binary file not shown.
@ -1,5 +0,0 @@
|
||||
# Font Squirrel Font-face Generator Configuration File
|
||||
# Upload this file to the generator to recreate the settings
|
||||
# you used to create these fonts.
|
||||
|
||||
{"mode":"basic","formats":["ttf","woff","woff2","eotz"],"tt_instructor":"default","fix_vertical_metrics":"Y","fix_gasp":"xy","add_spaces":"Y","add_hyphens":"Y","fallback":"none","fallback_custom":"100","options_subset":"basic","subset_custom":"","subset_custom_range":"","subset_ot_features_list":"","css_stylesheet":"stylesheet.css","filename_suffix":"-webfont","emsquare":"2048","spacing_adjustment":"0"}
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
@ -1,7 +0,0 @@
|
||||
(function($){$.fn.easyTabs=function(option){var param=jQuery.extend({fadeSpeed:"fast",defaultContent:1,activeClass:'active'},option);$(this).each(function(){var thisId="#"+this.id;if(param.defaultContent==''){param.defaultContent=1;}
|
||||
if(typeof param.defaultContent=="number")
|
||||
{var defaultTab=$(thisId+" .tabs li:eq("+(param.defaultContent-1)+") a").attr('href').substr(1);}else{var defaultTab=param.defaultContent;}
|
||||
$(thisId+" .tabs li a").each(function(){var tabToHide=$(this).attr('href').substr(1);$("#"+tabToHide).addClass('easytabs-tab-content');});hideAll();changeContent(defaultTab);function hideAll(){$(thisId+" .easytabs-tab-content").hide();}
|
||||
function changeContent(tabId){hideAll();$(thisId+" .tabs li").removeClass(param.activeClass);$(thisId+" .tabs li a[href=#"+tabId+"]").closest('li').addClass(param.activeClass);if(param.fadeSpeed!="none")
|
||||
{$(thisId+" #"+tabId).fadeIn(param.fadeSpeed);}else{$(thisId+" #"+tabId).show();}}
|
||||
$(thisId+" .tabs li").click(function(){var tabId=$(this).find('a').attr('href').substr(1);changeContent(tabId);return false;});});}})(jQuery);
|
@ -1,129 +0,0 @@
|
||||
/*Notes about grid:
|
||||
Columns: 12
|
||||
Grid Width: 825px
|
||||
Column Width: 55px
|
||||
Gutter Width: 15px
|
||||
-------------------------------*/
|
||||
|
||||
|
||||
|
||||
.section {margin-bottom: 18px;
|
||||
}
|
||||
.section:after {content: ".";display: block;height: 0;clear: both;visibility: hidden;}
|
||||
.section {*zoom: 1;}
|
||||
|
||||
.section .firstcolumn,
|
||||
.section .firstcol {margin-left: 0;}
|
||||
|
||||
|
||||
/* Border on left hand side of a column. */
|
||||
.border {
|
||||
padding-left: 7px;
|
||||
margin-left: 7px;
|
||||
border-left: 1px solid #eee;
|
||||
}
|
||||
|
||||
/* Border with more whitespace, spans one column. */
|
||||
.colborder {
|
||||
padding-left: 42px;
|
||||
margin-left: 42px;
|
||||
border-left: 1px solid #eee;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* The Grid Classes */
|
||||
.grid1, .grid1_2cols, .grid1_3cols, .grid1_4cols, .grid2, .grid2_3cols, .grid2_4cols, .grid3, .grid3_2cols, .grid3_4cols, .grid4, .grid4_3cols, .grid5, .grid5_2cols, .grid5_3cols, .grid5_4cols, .grid6, .grid6_4cols, .grid7, .grid7_2cols, .grid7_3cols, .grid7_4cols, .grid8, .grid8_3cols, .grid9, .grid9_2cols, .grid9_4cols, .grid10, .grid10_3cols, .grid10_4cols, .grid11, .grid11_2cols, .grid11_3cols, .grid11_4cols, .grid12
|
||||
{margin-left: 15px;float: left;display: inline; overflow: hidden;}
|
||||
|
||||
|
||||
.width1, .grid1, .span-1 {width: 55px;}
|
||||
.width1_2cols,.grid1_2cols {width: 20px;}
|
||||
.width1_3cols,.grid1_3cols {width: 8px;}
|
||||
.width1_4cols,.grid1_4cols {width: 2px;}
|
||||
.input_width1 {width: 49px;}
|
||||
|
||||
.width2, .grid2, .span-2 {width: 125px;}
|
||||
.width2_3cols,.grid2_3cols {width: 31px;}
|
||||
.width2_4cols,.grid2_4cols {width: 20px;}
|
||||
.input_width2 {width: 119px;}
|
||||
|
||||
.width3, .grid3, .span-3 {width: 195px;}
|
||||
.width3_2cols,.grid3_2cols {width: 90px;}
|
||||
.width3_4cols,.grid3_4cols {width: 37px;}
|
||||
.input_width3 {width: 189px;}
|
||||
|
||||
.width4, .grid4, .span-4 {width: 265px;}
|
||||
.width4_3cols,.grid4_3cols {width: 78px;}
|
||||
.input_width4 {width: 259px;}
|
||||
|
||||
.width5, .grid5, .span-5 {width: 335px;}
|
||||
.width5_2cols,.grid5_2cols {width: 160px;}
|
||||
.width5_3cols,.grid5_3cols {width: 101px;}
|
||||
.width5_4cols,.grid5_4cols {width: 72px;}
|
||||
.input_width5 {width: 329px;}
|
||||
|
||||
.width6, .grid6, .span-6 {width: 405px;}
|
||||
.width6_4cols,.grid6_4cols {width: 90px;}
|
||||
.input_width6 {width: 399px;}
|
||||
|
||||
.width7, .grid7, .span-7 {width: 475px;}
|
||||
.width7_2cols,.grid7_2cols {width: 230px;}
|
||||
.width7_3cols,.grid7_3cols {width: 148px;}
|
||||
.width7_4cols,.grid7_4cols {width: 107px;}
|
||||
.input_width7 {width: 469px;}
|
||||
|
||||
.width8, .grid8, .span-8 {width: 545px;}
|
||||
.width8_3cols,.grid8_3cols {width: 171px;}
|
||||
.input_width8 {width: 539px;}
|
||||
|
||||
.width9, .grid9, .span-9 {width: 615px;}
|
||||
.width9_2cols,.grid9_2cols {width: 300px;}
|
||||
.width9_4cols,.grid9_4cols {width: 142px;}
|
||||
.input_width9 {width: 609px;}
|
||||
|
||||
.width10, .grid10, .span-10 {width: 685px;}
|
||||
.width10_3cols,.grid10_3cols {width: 218px;}
|
||||
.width10_4cols,.grid10_4cols {width: 160px;}
|
||||
.input_width10 {width: 679px;}
|
||||
|
||||
.width11, .grid11, .span-11 {width: 755px;}
|
||||
.width11_2cols,.grid11_2cols {width: 370px;}
|
||||
.width11_3cols,.grid11_3cols {width: 241px;}
|
||||
.width11_4cols,.grid11_4cols {width: 177px;}
|
||||
.input_width11 {width: 749px;}
|
||||
|
||||
.width12, .grid12, .span-12 {width: 825px;}
|
||||
.input_width12 {width: 819px;}
|
||||
|
||||
/* Subdivided grid spaces */
|
||||
.emptycols_left1, .prepend-1 {padding-left: 70px;}
|
||||
.emptycols_right1, .append-1 {padding-right: 70px;}
|
||||
.emptycols_left2, .prepend-2 {padding-left: 140px;}
|
||||
.emptycols_right2, .append-2 {padding-right: 140px;}
|
||||
.emptycols_left3, .prepend-3 {padding-left: 210px;}
|
||||
.emptycols_right3, .append-3 {padding-right: 210px;}
|
||||
.emptycols_left4, .prepend-4 {padding-left: 280px;}
|
||||
.emptycols_right4, .append-4 {padding-right: 280px;}
|
||||
.emptycols_left5, .prepend-5 {padding-left: 350px;}
|
||||
.emptycols_right5, .append-5 {padding-right: 350px;}
|
||||
.emptycols_left6, .prepend-6 {padding-left: 420px;}
|
||||
.emptycols_right6, .append-6 {padding-right: 420px;}
|
||||
.emptycols_left7, .prepend-7 {padding-left: 490px;}
|
||||
.emptycols_right7, .append-7 {padding-right: 490px;}
|
||||
.emptycols_left8, .prepend-8 {padding-left: 560px;}
|
||||
.emptycols_right8, .append-8 {padding-right: 560px;}
|
||||
.emptycols_left9, .prepend-9 {padding-left: 630px;}
|
||||
.emptycols_right9, .append-9 {padding-right: 630px;}
|
||||
.emptycols_left10, .prepend-10 {padding-left: 700px;}
|
||||
.emptycols_right10, .append-10 {padding-right: 700px;}
|
||||
.emptycols_left11, .prepend-11 {padding-left: 770px;}
|
||||
.emptycols_right11, .append-11 {padding-right: 770px;}
|
||||
.pull-1 {margin-left: -70px;}
|
||||
.push-1 {margin-right: -70px;margin-left: 18px;float: right;}
|
||||
.pull-2 {margin-left: -140px;}
|
||||
.push-2 {margin-right: -140px;margin-left: 18px;float: right;}
|
||||
.pull-3 {margin-left: -210px;}
|
||||
.push-3 {margin-right: -210px;margin-left: 18px;float: right;}
|
||||
.pull-4 {margin-left: -280px;}
|
||||
.push-4 {margin-right: -280px;margin-left: 18px;float: right;}
|
@ -1,396 +0,0 @@
|
||||
@import url('grid_12-825-55-15.css');
|
||||
|
||||
/*
|
||||
CSS Reset by Eric Meyer - Released under Public Domain
|
||||
http://meyerweb.com/eric/tools/css/reset/
|
||||
*/
|
||||
html, body, div, span, applet, object, iframe,
|
||||
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
||||
a, abbr, acronym, address, big, cite, code,
|
||||
del, dfn, em, font, img, ins, kbd, q, s, samp,
|
||||
small, strike, strong, sub, sup, tt, var,
|
||||
b, u, i, center, dl, dt, dd, ol, ul, li,
|
||||
fieldset, form, label, legend, table,
|
||||
caption, tbody, tfoot, thead, tr, th, td
|
||||
{margin: 0;padding: 0;border: 0;outline: 0;
|
||||
font-size: 100%;vertical-align: baseline;
|
||||
background: transparent;}
|
||||
body {line-height: 1;}
|
||||
ol, ul {list-style: none;}
|
||||
blockquote, q {quotes: none;}
|
||||
blockquote:before, blockquote:after,
|
||||
q:before, q:after {content: ''; content: none;}
|
||||
:focus {outline: 0;}
|
||||
ins {text-decoration: none;}
|
||||
del {text-decoration: line-through;}
|
||||
table {border-collapse: collapse;border-spacing: 0;}
|
||||
|
||||
|
||||
|
||||
|
||||
body {
|
||||
color: #000;
|
||||
background-color: #dcdcdc;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
color: #1883ba;
|
||||
}
|
||||
|
||||
h1{
|
||||
font-size: 32px;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
|
||||
h2{
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
#container {
|
||||
width: 865px;
|
||||
margin: 0px auto;
|
||||
}
|
||||
|
||||
|
||||
#header {
|
||||
padding: 20px;
|
||||
font-size: 36px;
|
||||
background-color: #000;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#header span {
|
||||
color: #666;
|
||||
}
|
||||
#main_content {
|
||||
background-color: #fff;
|
||||
padding: 60px 20px 20px;
|
||||
}
|
||||
|
||||
|
||||
#footer p {
|
||||
margin: 0;
|
||||
padding-top: 10px;
|
||||
padding-bottom: 50px;
|
||||
color: #333;
|
||||
font: 10px Arial, sans-serif;
|
||||
}
|
||||
|
||||
.tabs {
|
||||
width: 100%;
|
||||
height: 31px;
|
||||
background-color: #444;
|
||||
}
|
||||
.tabs li {
|
||||
float: left;
|
||||
margin: 0;
|
||||
overflow: hidden;
|
||||
background-color: #444;
|
||||
}
|
||||
.tabs li a {
|
||||
display: block;
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
font: bold 11px/11px 'Arial';
|
||||
text-transform: uppercase;
|
||||
padding: 10px 15px;
|
||||
border-right: 1px solid #fff;
|
||||
}
|
||||
|
||||
.tabs li a:hover {
|
||||
background-color: #00b3ff;
|
||||
|
||||
}
|
||||
|
||||
.tabs li.active a {
|
||||
color: #000;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
|
||||
|
||||
div.huge {
|
||||
|
||||
font-size: 120px;
|
||||
line-height: 1em;
|
||||
padding: 0;
|
||||
letter-spacing: -.02em;
|
||||
overflow: hidden;
|
||||
}
|
||||
div.glyph_range {
|
||||
font-size: 72px;
|
||||
line-height: 1.1em;
|
||||
}
|
||||
|
||||
.size10{ font-size: 10px; }
|
||||
.size11{ font-size: 11px; }
|
||||
.size12{ font-size: 12px; }
|
||||
.size13{ font-size: 13px; }
|
||||
.size14{ font-size: 14px; }
|
||||
.size16{ font-size: 16px; }
|
||||
.size18{ font-size: 18px; }
|
||||
.size20{ font-size: 20px; }
|
||||
.size24{ font-size: 24px; }
|
||||
.size30{ font-size: 30px; }
|
||||
.size36{ font-size: 36px; }
|
||||
.size48{ font-size: 48px; }
|
||||
.size60{ font-size: 60px; }
|
||||
.size72{ font-size: 72px; }
|
||||
.size90{ font-size: 90px; }
|
||||
|
||||
|
||||
.psample_row1 { height: 120px;}
|
||||
.psample_row1 { height: 120px;}
|
||||
.psample_row2 { height: 160px;}
|
||||
.psample_row3 { height: 160px;}
|
||||
.psample_row4 { height: 160px;}
|
||||
|
||||
.psample {
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
}
|
||||
.psample p {
|
||||
line-height: 1.3em;
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.psample span {
|
||||
margin-right: .5em;
|
||||
}
|
||||
|
||||
.white_blend {
|
||||
width: 100%;
|
||||
height: 61px;
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAO1JREFUeNrs3TsKgFAMRUE/eer+NxztxMYuEWQG3ECKwwUF58ycAKixOAGAyAKILAAiCyCyACILgMgCiCyAyAIgsgAiCyCyAIgsgMgCiCwAIgsgsgAiC4DIAogsACIL0CWuZ3UGgLrIhjMA1EV2OAOAJQtgyQLwjOzmDAAiCyCyAIgsQFtkd2cAEFkAkQVAZAHaIns4A4AlC2DJAiCyACILILIAiCzAV5H1dQGAJQsgsgCILIDIAvwisl58AViyAJYsACILILIAIgvAe2T9EhxAZAFEFgCRBeiL7HAGgLrIhjMAWLIAliwAt1OAAQDwygTBulLIlQAAAABJRU5ErkJggg==);
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
}
|
||||
.black_blend {
|
||||
width: 100%;
|
||||
height: 61px;
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPJJREFUeNrs3TEKhTAQRVGjibr/9QoxhY2N3Ywo50A28IrLwP9g6b1PAMSYTQAgsgAiC4DIAogsgMgCILIAIgsgsgCILIDIAogsACILILIAIguAyAKILIDIAiCyACILgMgCZCnjLWYAiFGvB0BQZJsZAFyyAC5ZAO6RXc0AILIAIguAyAKkRXYzA4DIAogsACILkBbZ3QwALlkAlywAIgsgsgAiC4DIArwVWf8uAHDJAogsACILILIAv4isH74AXLIALlkARBZAZAFEFoDnyPokOIDIAogsACILkBfZZgaAuMhWMwC4ZAE+p4x3mAEgxinAAJ+XBbPWGkwAAAAAAElFTkSuQmCC);
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
}
|
||||
.fullreverse {
|
||||
background: #000 !important;
|
||||
color: #fff !important;
|
||||
margin-left: -20px;
|
||||
padding-left: 20px;
|
||||
margin-right: -20px;
|
||||
padding-right: 20px;
|
||||
padding: 20px;
|
||||
margin-bottom:0;
|
||||
}
|
||||
|
||||
|
||||
.sample_table td {
|
||||
padding-top: 3px;
|
||||
padding-bottom:5px;
|
||||
padding-left: 5px;
|
||||
vertical-align: middle;
|
||||
line-height: 1.2em;
|
||||
}
|
||||
|
||||
.sample_table td:first-child {
|
||||
background-color: #eee;
|
||||
text-align: right;
|
||||
padding-right: 5px;
|
||||
padding-left: 0;
|
||||
padding: 5px;
|
||||
font: 11px/12px "Courier New", Courier, mono;
|
||||
}
|
||||
|
||||
code {
|
||||
white-space: pre;
|
||||
background-color: #eee;
|
||||
display: block;
|
||||
padding: 10px;
|
||||
margin-bottom: 18px;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
|
||||
.bottom,.last {margin-bottom:0 !important; padding-bottom:0 !important;}
|
||||
|
||||
.box {
|
||||
padding: 18px;
|
||||
margin-bottom: 18px;
|
||||
background: #eee;
|
||||
}
|
||||
|
||||
.reverse,.reversed { background: #000 !important;color: #fff !important; border: none !important;}
|
||||
|
||||
#bodycomparison {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
font-size: 72px;
|
||||
height: 90px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
#bodycomparison div{
|
||||
font-size: 72px;
|
||||
line-height: 90px;
|
||||
display: inline;
|
||||
margin: 0 15px 0 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#bodycomparison div span{
|
||||
font: 10px Arial;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
}
|
||||
#xheight {
|
||||
float: none;
|
||||
position: absolute;
|
||||
color: #d9f3ff;
|
||||
font-size: 72px;
|
||||
line-height: 90px;
|
||||
}
|
||||
|
||||
.fontbody {
|
||||
position: relative;
|
||||
}
|
||||
.arialbody{
|
||||
font-family: Arial;
|
||||
position: relative;
|
||||
}
|
||||
.verdanabody{
|
||||
font-family: Verdana;
|
||||
position: relative;
|
||||
}
|
||||
.georgiabody{
|
||||
font-family: Georgia;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
/* @group Layout page
|
||||
*/
|
||||
|
||||
#layout h1 {
|
||||
font-size: 36px;
|
||||
line-height: 42px;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
#layout h2 {
|
||||
font-size: 24px;
|
||||
line-height: 23px;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
#layout h3 {
|
||||
font-size: 22px;
|
||||
line-height: 1.4em;
|
||||
margin-top: 1em;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
|
||||
#layout p.byline {
|
||||
font-size: 12px;
|
||||
margin-top: 18px;
|
||||
line-height: 12px;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
#layout p {
|
||||
font-size: 14px;
|
||||
line-height: 21px;
|
||||
margin-bottom: .5em;
|
||||
}
|
||||
|
||||
#layout p.large{
|
||||
font-size: 18px;
|
||||
line-height: 26px;
|
||||
}
|
||||
|
||||
#layout .sidebar p{
|
||||
font-size: 12px;
|
||||
line-height: 1.4em;
|
||||
}
|
||||
|
||||
#layout p.caption {
|
||||
font-size: 10px;
|
||||
margin-top: -16px;
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
|
||||
/* @end */
|
||||
|
||||
/* @group Glyphs */
|
||||
|
||||
#glyph_chart div{
|
||||
background-color: #d9f3ff;
|
||||
color: black;
|
||||
float: left;
|
||||
font-size: 36px;
|
||||
height: 1.2em;
|
||||
line-height: 1.2em;
|
||||
margin-bottom: 1px;
|
||||
margin-right: 1px;
|
||||
text-align: center;
|
||||
width: 1.2em;
|
||||
position: relative;
|
||||
padding: .6em .2em .2em;
|
||||
}
|
||||
|
||||
#glyph_chart div p {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
display: block;
|
||||
text-align: center;
|
||||
font: bold 9px Arial, sans-serif;
|
||||
background-color: #3a768f;
|
||||
width: 100%;
|
||||
color: #fff;
|
||||
padding: 2px 0;
|
||||
}
|
||||
|
||||
|
||||
#glyphs h1 {
|
||||
font-family: Arial, sans-serif;
|
||||
}
|
||||
/* @end */
|
||||
|
||||
/* @group Installing */
|
||||
|
||||
#installing {
|
||||
font: 13px Arial, sans-serif;
|
||||
}
|
||||
|
||||
#installing p,
|
||||
#glyphs p{
|
||||
line-height: 1.2em;
|
||||
margin-bottom: 18px;
|
||||
font: 13px Arial, sans-serif;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#installing h3{
|
||||
font-size: 15px;
|
||||
margin-top: 18px;
|
||||
}
|
||||
|
||||
/* @end */
|
||||
|
||||
#rendering h1 {
|
||||
font-family: Arial, sans-serif;
|
||||
}
|
||||
.render_table td {
|
||||
font: 11px "Courier New", Courier, mono;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
|
@ -1,16 +0,0 @@
|
||||
/* Generated by Font Squirrel (http://www.fontsquirrel.com) on April 28, 2015 */
|
||||
|
||||
|
||||
|
||||
@font-face {
|
||||
font-family: 'notokr-bold';
|
||||
src: url('notokr-bold.eot');
|
||||
src: url('notokr-bold.eot?#iefix') format('embedded-opentype'),
|
||||
url('notokr-bold.woff2') format('woff2'),
|
||||
url('notokr-bold.woff') format('woff'),
|
||||
url('notokr-bold.ttf') format('truetype'),
|
||||
url('notokr-bold.svg#notokr-bold') format('svg');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
|
||||
}
|
@ -1,5 +0,0 @@
|
||||
# Font Squirrel Font-face Generator Configuration File
|
||||
# Upload this file to the generator to recreate the settings
|
||||
# you used to create these fonts.
|
||||
|
||||
{"mode":"basic","formats":["ttf","woff","woff2","eotz"],"tt_instructor":"default","fix_vertical_metrics":"Y","fix_gasp":"xy","add_spaces":"Y","add_hyphens":"Y","fallback":"none","fallback_custom":"100","options_subset":"basic","subset_custom":"","subset_custom_range":"","subset_ot_features_list":"","css_stylesheet":"stylesheet.css","filename_suffix":"-webfont","emsquare":"2048","spacing_adjustment":"0"}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue