Compare commits
No commits in common. "00a4a6c4d23db2557e92a74971128a5e3f8e55a7" and "4fae61105cfa23b6aad2bee1b68be069468d1484" have entirely different histories.
00a4a6c4d2
...
4fae61105c
17
.gitignore
vendored
17
.gitignore
vendored
@ -36,20 +36,3 @@ Thumbs.db
|
||||
|
||||
# 설치 패키지 빌드 산출물(make_package.sh 로 재생성)
|
||||
/dist/
|
||||
|
||||
# MCP 설정(API 키 포함 — 커밋 금지)
|
||||
.mcp.json
|
||||
|
||||
# 고객 실데이터·DDL·설치노트·스크린샷 — 보안상 Gitea 커밋 금지(별도 안전경로 전송)
|
||||
docs/mms_data/
|
||||
docs/MSS ddl/
|
||||
docs/설치관련/
|
||||
docs/itsm_feature.txt
|
||||
*.csv
|
||||
|
||||
# 고객 DB 완전 덤프(2026-07-22 제공) — 보안상 커밋 금지
|
||||
/ITSM_DB/
|
||||
/ITSM_DB.zip
|
||||
|
||||
# graphify 로컬 산출물
|
||||
/graphify-out/
|
||||
|
||||
@ -492,11 +492,8 @@ public class CommonUtil
|
||||
*/
|
||||
|
||||
String strTocken = "";
|
||||
// 2026-07-19 fix: 2번째 replace 가 authorization(원문)을 다시 읽어 strTocken 을 덮어써
|
||||
// "Bearer " 접두가 남던 버그 → JwtHelper.decode 시 MalformedInputException.
|
||||
// strTocken 기준으로 연쇄 치환하도록 정정(대/소문자 모두 제거).
|
||||
strTocken = StringUtils.replace(authorization, "Bearer ","");
|
||||
strTocken = StringUtils.replace(strTocken, "bearer ","");
|
||||
strTocken = StringUtils.replace(authorization, "bearer ","");
|
||||
|
||||
Jwt jwt = JwtHelper.decode(strTocken);
|
||||
|
||||
|
||||
@ -80,25 +80,7 @@ public class MainController
|
||||
|
||||
@Value("${custom.front_host_info}")
|
||||
private String strFrontHostInfo;
|
||||
|
||||
// 2026.07.19 SR#1 : 시스템 관리자(KIC 담당자) 성명/호칭 동적 셋팅 (미설정 시 "시스템 관리자")
|
||||
@Value("${custom.adminName:}")
|
||||
private String strAdminName;
|
||||
|
||||
@Value("${custom.adminTitle:}")
|
||||
private String strAdminTitle;
|
||||
|
||||
private String getAdminDisplay()
|
||||
{
|
||||
String strName = (strAdminName == null) ? "" : strAdminName.trim();
|
||||
String strTitle = (strAdminTitle == null) ? "" : strAdminTitle.trim();
|
||||
if(strName.equals(""))
|
||||
{
|
||||
return "시스템 관리자";
|
||||
}
|
||||
return "시스템 관리자(" + strName + (strTitle.equals("") ? "" : " " + strTitle) + ")";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Header Page를 조회한다.
|
||||
* @param menuManageVO MenuManageVO
|
||||
@ -290,18 +272,10 @@ public class MainController
|
||||
{
|
||||
resBody.put("resultCd" , -6 );
|
||||
resBody.put("resultMsg", "사용자정보가 일치하지 않습니다." );
|
||||
|
||||
|
||||
return ResultData.ok(resBody);
|
||||
}
|
||||
// 2026.07.19 SR#1 : 계정이 잠겨 있는 경우 비밀번호 초기화 차단 + 잠금 안내 (관리자가 잠금 해제 후 초기화 가능)
|
||||
else if(CommonUtil.nvl(userInfoMap.get("lockAt")).equals("Y"))
|
||||
{
|
||||
resBody.put("resultCd" , -7 );
|
||||
resBody.put("resultMsg", "로그인 시도 횟수 초과로 계정이 잠겼습니다. " + getAdminDisplay() + "에게 문의 바랍니다." );
|
||||
|
||||
return ResultData.ok(resBody);
|
||||
}
|
||||
|
||||
|
||||
String strResetPassword = CommonUtil.getRandomChar(10);
|
||||
|
||||
log.info("새로운 비밀번호 [{}]", strResetPassword );
|
||||
|
||||
@ -283,34 +283,12 @@ public class SvcDeskController
|
||||
|
||||
LinkedHashMap<String, Object> resBody = new LinkedHashMap<String, Object>();
|
||||
|
||||
LinkedHashMap<String, Object> incidentVoMap = (LinkedHashMap<String, Object>)requestMap.get("incidentVo" ); // 서비스 기본정보
|
||||
LinkedHashMap<String, Object> incidentVoMap = (LinkedHashMap<String, Object>)requestMap.get("incidentVo" ); // 인스던트 기본정보
|
||||
LinkedHashMap<String, Object> reqApprovalMap = (LinkedHashMap<String, Object>)requestMap.get("reqApprovalMap" ); // 승인요청 정보
|
||||
List<LinkedHashMap<String, Object>> approvalsList = (List<LinkedHashMap<String, Object>>)requestMap.get("approvalsList"); // 서비스 결재정보
|
||||
List<LinkedHashMap<String, Object>> fileList = (List<LinkedHashMap<String, Object>>)requestMap.get("fileList" ); // 서비스 첨부파일
|
||||
|
||||
// 2026.07.19 SR#12 : 입력값 길이 예외처리 (초과 시 명확한 안내 + 등록 차단)
|
||||
String strTitle = CommonUtil.nvl(incidentVoMap.get("vcIncidentTitle"));
|
||||
String strBody = CommonUtil.nvl(incidentVoMap.get("txIncidentBody"));
|
||||
if(strTitle.length() > 200)
|
||||
{
|
||||
resBody.put("resultCd" , "-2" );
|
||||
resBody.put("resultMsg" , "제목은 200자 이내로 입력해 주세요. (현재 " + strTitle.length() + "자)" );
|
||||
return ResultData.ok(resBody);
|
||||
}
|
||||
if(strBody.length() > 60000)
|
||||
{
|
||||
resBody.put("resultCd" , "-2" );
|
||||
resBody.put("resultMsg" , "본문 내용이 너무 깁니다. 60,000자 이내로 입력해 주세요." );
|
||||
return ResultData.ok(resBody);
|
||||
}
|
||||
|
||||
// 2026.07.19 SR#9-2,9-3 : 접수자/접수일시는 서버 권한값으로 강제 (일반 사용자의 임의 조작 차단)
|
||||
TokenInfo tokenInfoReg = CommonUtil.getAccessTokenInfo(request);
|
||||
incidentVoMap.put("inRegUser" , tokenInfoReg.getUniqId()); // 접수자 ID = 로그인 사용자
|
||||
incidentVoMap.put("vcRegUser" , tokenInfoReg.getUserName()); // 접수자 명 = 로그인 사용자
|
||||
incidentVoMap.put("dtReceiptDatetime", CommonUtil.getKST("yyyy-MM-dd HH:mm")); // 접수일시 = 서버 현재시각
|
||||
|
||||
// 서비스 등록
|
||||
List<LinkedHashMap<String, Object>> approvalsList = (List<LinkedHashMap<String, Object>>)requestMap.get("approvalsList"); // 인스던트 결재정보
|
||||
List<LinkedHashMap<String, Object>> fileList = (List<LinkedHashMap<String, Object>>)requestMap.get("fileList" ); // 인스던트 첨부파일
|
||||
|
||||
// 서비스 인스던트 등록
|
||||
LinkedHashMap<String, Object> returnMap = svcDeskService.addIncident(incidentVoMap, approvalsList, fileList, reqApprovalMap);
|
||||
|
||||
int iSucc = (int)returnMap.get("iSucc");
|
||||
|
||||
@ -74,17 +74,10 @@ public class SvcDeskReqController
|
||||
|
||||
// 토큰정보 획득
|
||||
TokenInfo tokenInfo = CommonUtil.getAccessTokenInfo(request);
|
||||
|
||||
|
||||
log.info("tokenInfo [{}]", tokenInfo.toString() );
|
||||
log.info("tokenInfo [{}]", tokenInfo.getAuthorities() );
|
||||
|
||||
// 2026.07.19 SR#16 : 일반 사용자(비관리자)는 본인이 신청한 건만 조회 (서버측 권한 제어)
|
||||
String strRoleReq = CommonUtil.nvl(tokenInfo.getAuthorities());
|
||||
if(strRoleReq.indexOf("ROLE_ADMIN") < 0)
|
||||
{
|
||||
requestMap.put("reqUserFilter", tokenInfo.getUniqId());
|
||||
}
|
||||
|
||||
|
||||
// 서비스데스크 조회
|
||||
List<LinkedHashMap<String, Object>> resultList = svcDeskReqService.searchReqIncident(requestMap);
|
||||
|
||||
@ -209,26 +202,10 @@ public class SvcDeskReqController
|
||||
|
||||
LinkedHashMap<String, Object> resBody = new LinkedHashMap<String, Object>();
|
||||
|
||||
LinkedHashMap<String, Object> incidentReqVoMap = (LinkedHashMap<String, Object>)requestMap.get("incidentReqVo" ); // 서비스 기본정보
|
||||
List<LinkedHashMap<String, Object>> fileList = (List<LinkedHashMap<String, Object>>)requestMap.get("fileList" ); // 서비스 첨부파일
|
||||
|
||||
// 2026.07.19 SR#12 : 입력값 길이 예외처리 (초과 시 명확한 안내 + 등록 차단)
|
||||
String strReqTitle = CommonUtil.nvl(incidentReqVoMap.get("vcIncidentTitle"));
|
||||
String strReqBody = CommonUtil.nvl(incidentReqVoMap.get("txIncidentBody"));
|
||||
if(strReqTitle.length() > 200)
|
||||
{
|
||||
resBody.put("resultCd" , "-2" );
|
||||
resBody.put("resultMsg" , "제목은 200자 이내로 입력해 주세요. (현재 " + strReqTitle.length() + "자)" );
|
||||
return ResultData.ok(resBody);
|
||||
}
|
||||
if(strReqBody.length() > 60000)
|
||||
{
|
||||
resBody.put("resultCd" , "-2" );
|
||||
resBody.put("resultMsg" , "본문 내용이 너무 깁니다. 60,000자 이내로 입력해 주세요." );
|
||||
return ResultData.ok(resBody);
|
||||
}
|
||||
|
||||
// 서비스 신청 등록
|
||||
LinkedHashMap<String, Object> incidentReqVoMap = (LinkedHashMap<String, Object>)requestMap.get("incidentReqVo" ); // 인스던트 기본정보
|
||||
List<LinkedHashMap<String, Object>> fileList = (List<LinkedHashMap<String, Object>>)requestMap.get("fileList" ); // 인스던트 첨부파일
|
||||
|
||||
// 서비스 인스던트 신청 등록
|
||||
LinkedHashMap<String, Object> returnMap = svcDeskReqService.addReqIncident(incidentReqVoMap, fileList);
|
||||
|
||||
int iSucc = (int)returnMap.get("iSucc");
|
||||
|
||||
@ -370,23 +370,14 @@ public class UserManageController
|
||||
|
||||
LinkedHashMap<String, Object> resBody = new LinkedHashMap<String, Object>();
|
||||
|
||||
// 사용자 기본정보 추출
|
||||
// 사용자 기본정보 추출
|
||||
LinkedHashMap<String, Object> userInfoMap = userManageService.selectUser(requestMap);
|
||||
|
||||
// 2026.07.19 SR#1 : 계정이 잠겨 있는 경우 비밀번호 초기화 차단 (잠금 해제 후 초기화 가능)
|
||||
if(CommonUtil.nvl(userInfoMap.get("lockAt")).equals("Y"))
|
||||
{
|
||||
resBody.put("resultCd" , "-2" );
|
||||
resBody.put("resultMsg", "계정이 잠겨 있습니다. [로그인인증제한해제]로 잠금을 먼저 해제한 후 비밀번호를 초기화하세요." );
|
||||
|
||||
return ResultData.ok(resBody);
|
||||
}
|
||||
|
||||
|
||||
if(CommonUtil.nvl(userInfoMap.get("emailAdres")).equals(""))
|
||||
{
|
||||
resBody.put("resultCd" , "-1" );
|
||||
resBody.put("resultMsg", "E-mail 이 존재하지 않습니다." );
|
||||
|
||||
|
||||
return ResultData.ok(resBody);
|
||||
}
|
||||
|
||||
|
||||
@ -22,10 +22,6 @@
|
||||
# jdbcUrl: jdbc:log4jdbc:mariadb://192.168.8.138:3306/ur_itms_db?characterEncoding=UTF-8&serverTimezone=Asia/Seoul&rewriteBatchedStatements=true
|
||||
username: g9IwFesTyIloXVpUnfOX0g==
|
||||
password: E4SOtjDqqO79BQERc/eaTw==
|
||||
|
||||
# - User: uritms_usr01
|
||||
# - Password: 123456
|
||||
# 서버 ssh root/ 1q2w3e!Q
|
||||
maximumPoolSize: 35
|
||||
minimumIdle: 2
|
||||
connectionTimeout: 3000
|
||||
|
||||
@ -35,8 +35,6 @@
|
||||
, IFNULL(b.USER_NM, a.PSTGR_NM) AS frstRegisterNm
|
||||
, DATE_FORMAT(a.FRST_REG_DTM, '%Y-%m-%d') AS frstRegisterPnttm
|
||||
, a.INQ_CNT AS inqireCo
|
||||
, ( SELECT COUNT(1) FROM TB_CMNT_INFO cc
|
||||
WHERE cc.NTT_ID = a.NTT_ID AND cc.USE_AT = 'Y' ) AS cmntCnt <!-- 2026.07.19 기능개선10/F10 : 댓글 수량 -->
|
||||
, a.PARNTSCTT_NO AS parnts
|
||||
, a.CMNT_AT AS replyAt
|
||||
, a.CMNT_LCTN AS replyLc
|
||||
|
||||
@ -46,12 +46,9 @@
|
||||
</sql>
|
||||
|
||||
<sql id="searchFilter">
|
||||
<!-- 2026.07.19 SR#14 : 신청번호 부분검색(와일드카드) 지원 + 바인딩(#{}) 적용 -->
|
||||
<if test="incidentReqNum != null and incidentReqNum != ''"> AND A.VC_REQ_INCIDENT_NUM LIKE CONCAT('%', #{incidentReqNum}, '%') </if>
|
||||
<if test="incidentReqNum != null and incidentReqNum != ''"> AND A.VC_REQ_INCIDENT_NUM = #{incidentReqNum} </if>
|
||||
<if test="reqUser != null and reqUser != ''"> AND A.VC_REQ_USER LIKE "%${reqUser}%" </if>
|
||||
<if test="incidentTitle != null and incidentTitle != ''"> AND A.VC_INCIDENT_TITLE LIKE "%${incidentTitle}%" </if>
|
||||
<!-- 2026.07.19 SR#16 : 일반 사용자는 본인 신청 건만 조회 (컨트롤러가 비관리자에 한해 reqUserFilter 주입) -->
|
||||
<if test="reqUserFilter != null and reqUserFilter != ''"> AND A.IN_REQ_USER = #{reqUserFilter} </if>
|
||||
</sql>
|
||||
|
||||
<select id="searchReqIncident" parameterType="java.util.HashMap" resultMap="reqIncident">
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
# ITMS CI/CD 배포 아티팩트
|
||||
# ITMS CI/CD 배포 아티팩트 (적용 대기)
|
||||
|
||||
> 생성: 2026-07-17 (산출물 준비형) → **2026-07-19 적용 완료(LIVE)** | 대상 저장소: Gitea `ythong/itms`
|
||||
> **상태: 가동 중.** 개발(itms.zioinfo.co.kr: front+auth+api 실로그인)·운영(itms.wise.ai.kr: front-only) 배포 완료, push 자동 연쇄(dev→prod) 동작. **현행 정본 문서는 `docs/CICD_PIPELINE.md`** — 아래 2026-07-17 기록은 당시 판정 이력으로 보존(피저빌리티 사유 중 JDK17 부재·DB 미도달은 이후 해소: JDK17 설치됨·dev MariaDB+역설계 스키마 적용).
|
||||
> 생성: 2026-07-17 (itms-cicd 하네스, 산출물 준비형) | 대상 저장소: Gitea `ythong/itms`
|
||||
> **상태: 적용 대기(NOT applied).** 이 디렉터리는 배포 대상 환경에서 적용할 준비된 산출물이다. 서버는 변경되지 않았다.
|
||||
|
||||
## 왜 "적용 대기"인가 (피저빌리티 게이트)
|
||||
|
||||
|
||||
@ -1,23 +0,0 @@
|
||||
# ITMS 모바일 APK — 서버 게시 준비물
|
||||
|
||||
> 로컬 준비물만 포함(서버 무접촉). 서버 작업은 담당 에이전트가 수행.
|
||||
|
||||
## 파일
|
||||
- `itms-latest.json` — 배포 매니페스트(버전·apkUrl·sizeBytes·sha256·publishedAt). `sizeBytes`/`sha256` 는 서버 배치 후 `publish_app_manifest.sh` 실행으로 확정.
|
||||
- `publish_app_manifest.sh` — APK 배치 후 매니페스트를 원자적으로 기록(+qrencode 있으면 QR PNG 생성). CAMP `deploy/publish_app_manifest.sh` 패턴.
|
||||
- `mobile-app.html` — `/mobile-app` 정적 게시 페이지(WISE 스타일, 다크모드 대응). `itms-latest.json` 을 fetch 해 버전/크기/SHA/다운로드 자동 표시. `itms-apk-qr.png` 존재 시 QR 표시, 없으면 다운로드 버튼 안내로 폴백.
|
||||
|
||||
## 서버 게시 절차(담당 에이전트용, 참고)
|
||||
```bash
|
||||
# 1) APK 배치
|
||||
cp itms-mobile-v1.0.0.apk /opt/itms/downloads/itms.apk
|
||||
# 2) 매니페스트 + QR 생성(운영 도메인)
|
||||
./publish_app_manifest.sh 1.0.0 /opt/itms/downloads/itms.apk https://itms.wise.ai.kr/downloads/itms.apk
|
||||
# 3) 정적 페이지 배치
|
||||
cp mobile-app.html /opt/itms/downloads/mobile-app.html # 또는 nginx location /mobile-app
|
||||
# 4) nginx: /downloads/ 와 /mobile-app 정적 서빙 + (필요 시) itms.apk MIME application/vnd.android.package-archive
|
||||
```
|
||||
|
||||
## 주의
|
||||
- EXPO 토큰·키스토어·자격증명 미포함. 공개 다운로드 URL만 기록.
|
||||
- 다운로드 URL 기본값은 운영(`itms.wise.ai.kr`). 개발 검증은 `https://itms.zioinfo.co.kr/downloads/itms.apk` 등으로 3번째 인자 지정.
|
||||
@ -1,13 +0,0 @@
|
||||
{
|
||||
"appName": "ITMS 유지보수관리 모바일 앱",
|
||||
"version": "1.0.0",
|
||||
"platform": "ANDROID",
|
||||
"apkUrl": "https://itms.wise.ai.kr/downloads/itms.apk",
|
||||
"downloadUrl": "https://itms.wise.ai.kr/downloads/itms.apk",
|
||||
"sizeBytes": 64069515,
|
||||
"fileSizeMb": 61.1,
|
||||
"sha256": "8421fa2a479ec6c8387eeca326910fc684975d70cdbe7c6eea4a541305451d8d",
|
||||
"publishedAt": "2026-07-19",
|
||||
"builtAt": "2026-07-19",
|
||||
"notes": "EAS build e37c6626-9aba-4b76-b616-862f48f1cc9c (preview 프로파일, APK). 서버 배치 후 publish_app_manifest.sh 로 sizeBytes/sha256 재확정."
|
||||
}
|
||||
@ -1,89 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>ITMS 모바일 앱 설치</title>
|
||||
<style>
|
||||
:root{ --brand:#1f29fc; --accent:#11c3ff; --bg:#f4f6f9; --card:#fff; --text:#252525; --muted:#6b7280; --border:#e6eaf0; }
|
||||
*{ box-sizing:border-box; }
|
||||
body{ margin:0; font-family:'Pretendard',system-ui,-apple-system,'Malgun Gothic',sans-serif; background:var(--bg); color:var(--text); }
|
||||
.wrap{ max-width:520px; margin:0 auto; padding:32px 20px 56px; }
|
||||
.hero{ background:linear-gradient(135deg,var(--accent),var(--brand)); border-radius:20px; padding:34px 24px; text-align:center; color:#fff; }
|
||||
.hero h1{ margin:0; font-size:34px; font-weight:900; letter-spacing:3px; }
|
||||
.hero p{ margin:8px 0 0; font-size:14px; opacity:.92; }
|
||||
.card{ background:var(--card); border:1px solid var(--border); border-radius:16px; padding:22px; margin-top:18px; }
|
||||
.qr{ display:flex; flex-direction:column; align-items:center; gap:12px; }
|
||||
.qr img{ width:220px; height:220px; border-radius:12px; background:#fff; padding:10px; border:1px solid var(--border); }
|
||||
.qr .hint{ color:var(--muted); font-size:13px; text-align:center; }
|
||||
.cta{ display:block; text-align:center; text-decoration:none; background:var(--brand); color:#fff; font-weight:800; font-size:16px; padding:15px; border-radius:14px; margin-top:16px; }
|
||||
.meta{ margin-top:14px; }
|
||||
.row{ display:flex; justify-content:space-between; padding:9px 0; border-bottom:1px solid var(--border); font-size:14px; }
|
||||
.row .k{ color:var(--muted); } .row .v{ font-weight:600; word-break:break-all; text-align:right; margin-left:12px; }
|
||||
.sha{ font-size:11px; color:var(--muted); word-break:break-all; margin-top:8px; }
|
||||
.note{ color:var(--muted); font-size:12px; line-height:1.7; margin-top:18px; }
|
||||
.steps{ counter-reset:s; padding:0; margin:12px 0 0; list-style:none; }
|
||||
.steps li{ counter-increment:s; position:relative; padding:6px 0 6px 30px; font-size:13px; color:var(--text); }
|
||||
.steps li::before{ content:counter(s); position:absolute; left:0; top:5px; width:20px; height:20px; border-radius:50%; background:var(--brand); color:#fff; font-size:12px; font-weight:800; display:flex; align-items:center; justify-content:center; }
|
||||
@media (prefers-color-scheme: dark){
|
||||
:root{ --bg:#0b0f17; --card:#141a26; --text:#e6edf3; --muted:#8b97a8; --border:#283142; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrap">
|
||||
<div class="hero">
|
||||
<h1>ITMS</h1>
|
||||
<p>IT 유지보수관리 모바일 앱</p>
|
||||
</div>
|
||||
|
||||
<div class="card qr">
|
||||
<img id="qr" src="itms-apk-qr.png" alt="설치 QR" onerror="this.style.display='none';document.getElementById('qrHint').textContent='아래 다운로드 버튼으로 설치하세요. (QR 이미지는 서버에서 생성)';" />
|
||||
<div class="hint" id="qrHint">카메라로 QR을 스캔하면 앱 다운로드가 시작됩니다.</div>
|
||||
<a class="cta" id="dl" href="#">APK 다운로드</a>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="meta">
|
||||
<div class="row"><span class="k">앱</span><span class="v" id="appName">ITMS 유지보수관리 모바일 앱</span></div>
|
||||
<div class="row"><span class="k">버전</span><span class="v" id="version">-</span></div>
|
||||
<div class="row"><span class="k">플랫폼</span><span class="v" id="platform">Android</span></div>
|
||||
<div class="row"><span class="k">크기</span><span class="v" id="size">-</span></div>
|
||||
<div class="row"><span class="k">배포일</span><span class="v" id="publishedAt">-</span></div>
|
||||
</div>
|
||||
<div class="sha" id="sha"></div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<strong>설치 방법</strong>
|
||||
<ol class="steps">
|
||||
<li>QR 스캔 또는 다운로드 버튼으로 APK를 내려받습니다.</li>
|
||||
<li>Android 설정에서 '출처를 알 수 없는 앱 설치'를 허용합니다.</li>
|
||||
<li>내려받은 APK를 실행해 설치합니다.</li>
|
||||
<li>ITMS 계정(아이디/비밀번호)으로 로그인합니다.</li>
|
||||
</ol>
|
||||
<p class="note">사내/기관 내부 배포용입니다. iOS는 별도 배포 채널을 통해 제공됩니다.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// itms-latest.json(매니페스트)을 읽어 화면 최신화. 백엔드 공개 엔드포인트로 대체 가능(fetch 경로만 변경).
|
||||
(function(){
|
||||
fetch('itms-latest.json', { cache: 'no-store' })
|
||||
.then(function(r){ return r.json(); })
|
||||
.then(function(m){
|
||||
var $ = function(id){ return document.getElementById(id); };
|
||||
if (m.appName) $('appName').textContent = m.appName;
|
||||
$('version').textContent = m.version || '-';
|
||||
$('platform').textContent = m.platform || 'Android';
|
||||
var mb = m.fileSizeMb; $('size').textContent = (mb && mb !== null) ? (mb + ' MB') : '-';
|
||||
$('publishedAt').textContent = m.publishedAt || m.builtAt || '-';
|
||||
var url = m.apkUrl || m.downloadUrl || '#';
|
||||
$('dl').setAttribute('href', url);
|
||||
if (m.sha256) $('sha').textContent = 'SHA-256: ' + m.sha256;
|
||||
})
|
||||
.catch(function(){ /* 매니페스트 없으면 정적 기본값 유지 */ });
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@ -1,57 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# ITMS 모바일 앱 배포 매니페스트 publish — APK 산출 후 1회 실행(웹 /mobile-app 자동 최신화).
|
||||
# · 역할: 서버 APK 옆에 itms-latest.json(버전·다운로드URL·빌드일자·크기·sha256)을 원자적으로 기록.
|
||||
# /mobile-app 페이지(또는 백엔드 공개 엔드포인트)가 이 파일을 읽어 QR/다운로드를 최신화.
|
||||
# · 보안: 자격증명·키스토어·EXPO 토큰 미취급. 공개 다운로드 URL만 기록.
|
||||
# · CAMP deploy/publish_app_manifest.sh 패턴 이식(솔루션=ITMS, 포트/도메인만 상이).
|
||||
#
|
||||
# 사용: publish_app_manifest.sh <version> <apk_path> [download_url]
|
||||
# 예) cp itms-mobile-v1.0.0.apk /opt/itms/downloads/itms.apk
|
||||
# publish_app_manifest.sh 1.0.0 /opt/itms/downloads/itms.apk https://itms.wise.ai.kr/downloads/itms.apk
|
||||
set -euo pipefail
|
||||
|
||||
VERSION="${1:?usage: publish_app_manifest.sh <version> <apk_path> [download_url]}"
|
||||
APK_PATH="${2:?usage: publish_app_manifest.sh <version> <apk_path> [download_url]}"
|
||||
DOWNLOAD_URL="${3:-${ITMS_APP_DOWNLOAD_URL:-https://itms.wise.ai.kr/downloads/itms.apk}}"
|
||||
|
||||
MANIFEST="${ITMS_APP_MANIFEST:-/opt/itms/downloads/itms-latest.json}"
|
||||
APP_NAME="${ITMS_APP_NAME:-ITMS 유지보수관리 모바일 앱}"
|
||||
PLATFORM="${ITMS_APP_PLATFORM:-ANDROID}"
|
||||
BUILT_AT="$(date +%Y-%m-%d)"
|
||||
|
||||
SIZE_BYTES="0"; SIZE_MB="null"; SHA256="null"
|
||||
if [ -f "$APK_PATH" ]; then
|
||||
SIZE_BYTES=$(stat -c%s "$APK_PATH" 2>/dev/null || wc -c < "$APK_PATH")
|
||||
SIZE_MB=$(awk -v b="$SIZE_BYTES" 'BEGIN { printf "%.1f", b/1048576 }')
|
||||
HASH=$(sha256sum "$APK_PATH" 2>/dev/null | awk '{print $1}')
|
||||
[ -n "$HASH" ] && SHA256="\"${HASH}\""
|
||||
fi
|
||||
|
||||
mkdir -p "$(dirname "$MANIFEST")"
|
||||
TMP="${MANIFEST}.tmp.$$"
|
||||
cat > "$TMP" <<JSON
|
||||
{
|
||||
"appName": "${APP_NAME}",
|
||||
"version": "${VERSION}",
|
||||
"platform": "${PLATFORM}",
|
||||
"apkUrl": "${DOWNLOAD_URL}",
|
||||
"downloadUrl": "${DOWNLOAD_URL}",
|
||||
"sizeBytes": ${SIZE_BYTES},
|
||||
"fileSizeMb": ${SIZE_MB},
|
||||
"sha256": ${SHA256},
|
||||
"publishedAt": "${BUILT_AT}",
|
||||
"builtAt": "${BUILT_AT}",
|
||||
"notes": null
|
||||
}
|
||||
JSON
|
||||
mv -f "$TMP" "$MANIFEST"
|
||||
|
||||
# (선택) /mobile-app 정적 페이지 옆 QR 이미지 생성 — qrencode 설치 시.
|
||||
if command -v qrencode >/dev/null 2>&1; then
|
||||
qrencode -o "$(dirname "$MANIFEST")/itms-apk-qr.png" -s 8 "$DOWNLOAD_URL" || true
|
||||
echo "[publish] QR -> $(dirname "$MANIFEST")/itms-apk-qr.png"
|
||||
fi
|
||||
|
||||
echo "[publish] manifest -> $MANIFEST"
|
||||
echo "[publish] version=$VERSION platform=$PLATFORM publishedAt=$BUILT_AT sizeBytes=$SIZE_BYTES sizeMb=$SIZE_MB"
|
||||
echo "[publish] apkUrl=$DOWNLOAD_URL"
|
||||
@ -14,25 +14,11 @@ server {
|
||||
server_name itms.wise.ai.kr;
|
||||
client_max_body_size 50m;
|
||||
|
||||
# ITMS 전용 모바일 앱 설치 페이지(WISE QR — itms-latest.json fetch)
|
||||
# 통합 메신저 앱 QR 다운로드 페이지(읽기전용, 중앙 ITSM APK 저장소 재사용)
|
||||
location = /mobile-app {
|
||||
alias /opt/itms/downloads/mobile-app.html;
|
||||
alias /opt/itms/static/mobile-app.html;
|
||||
default_type text/html;
|
||||
}
|
||||
# APK 게시 자산 (매니페스트/QR/다운로드) — dev→prod tar-over-ssh 배치 후 서빙
|
||||
location = /itms-latest.json {
|
||||
default_type application/json;
|
||||
alias /opt/itms/downloads/itms-latest.json;
|
||||
}
|
||||
location = /itms-apk-qr.png {
|
||||
alias /opt/itms/downloads/itms-apk-qr.png;
|
||||
}
|
||||
location /downloads/ {
|
||||
alias /opt/itms/downloads/;
|
||||
types { application/vnd.android.package-archive apk; }
|
||||
default_type application/octet-stream;
|
||||
add_header Content-Disposition "attachment";
|
||||
}
|
||||
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:11020;
|
||||
|
||||
@ -1,25 +1,13 @@
|
||||
# itms.zioinfo.co.kr — ITMS 리버스 프록시 (개발서버, Stage B 라이브 반영)
|
||||
# 서버(101.79.17.164). 브라우저 진입점 = front(:11020).
|
||||
# itms.zioinfo.co.kr — ITMS 리버스 프록시 (적용 대기 템플릿)
|
||||
# 개발서버 도메인: itms.zioinfo.co.kr → 서버(101.79.17.164, 내부 10.0.1.6)
|
||||
#
|
||||
# 구성 (Stage B — 웹 + 모바일 동시 지원):
|
||||
# - front(:11020) : 브라우저 JSP 화면 (세션 기반). 기본 경로.
|
||||
# - auth(:11000) : OAuth2 인가서버. 모바일 password/refresh grant → /oauth/.
|
||||
# - api(:11010) : 업무 REST(Bearer JWT). 모바일 앱이 도메인 경유 직접 호출.
|
||||
# 선결(라이브 조건):
|
||||
# 1) Tier2 앱 기동: front(11020) 필수, 필요 시 auth(11000)/api(11010) — 런타임 DB·JDK17·기관 프로파일 확보 환경에서
|
||||
# 2) TLS 인증서 발급(itms.zioinfo.co.kr) — 예: certbot --nginx -d itms.zioinfo.co.kr
|
||||
# ※ 앱 미기동 상태에서 적용하면 502. 인증서 미발급 시 443 블록의 ssl_certificate 경로부터 맞출 것.
|
||||
#
|
||||
# ★경로 충돌 해소(실측): front 와 api 가 동일 prefix(/main·/srm·/rem·/sys·/potl 등)를
|
||||
# 각각 화면(11020)·REST(11010)로 제공한다. 순수 경로 분기 불가 → **Authorization: Bearer
|
||||
# 헤더**로 분기($itms_biz_backend map). 모바일은 항상 Bearer 전송(→api), 브라우저는 세션
|
||||
# 쿠키(무 Bearer→front). 이로써 웹/모바일이 한 도메인에서 공존.
|
||||
# ※ 모바일 앱(workspace/itms/mobile)은 '/api/' prefix 가 아니라 **루트 업무 prefix**
|
||||
# (/oauth·/main·/srm·/rem·/bbs·/cmm·/sta·/sys·/potl)를 사용한다(constants/Config.ts 권위).
|
||||
#
|
||||
# 선결: front/auth/api 기동 + certbot(--nginx -d itms.zioinfo.co.kr). 미기동 시 502.
|
||||
|
||||
# 모바일(Bearer JWT)=api(:11010) / 브라우저(세션)=front(:11020) 헤더 기반 분기
|
||||
map $http_authorization $itms_biz_backend {
|
||||
default http://127.0.0.1:11020;
|
||||
"~*^Bearer " http://127.0.0.1:11010;
|
||||
}
|
||||
# 진입점: front(:11020) 가 브라우저 진입점. front 가 auth/api 를 서버측 REST(Unirest)로 경유하므로
|
||||
# 일반적으로 front 만 프록시하면 됨. (OAuth 리다이렉트가 브라우저를 auth 로 보내는 구성이면 /oauth 블록 활성화)
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
@ -31,52 +19,18 @@ server {
|
||||
listen 443 ssl;
|
||||
server_name itms.zioinfo.co.kr;
|
||||
|
||||
ssl_certificate /etc/letsencrypt/live/itms.zioinfo.co.kr/fullchain.pem;
|
||||
ssl_certificate /etc/letsencrypt/live/itms.zioinfo.co.kr/fullchain.pem; # 발급 후 실제 경로로
|
||||
ssl_certificate_key /etc/letsencrypt/live/itms.zioinfo.co.kr/privkey.pem;
|
||||
|
||||
client_max_body_size 50m;
|
||||
|
||||
# ITMS 전용 모바일 앱 설치 페이지(WISE QR — itms-latest.json fetch)
|
||||
# 통합 메신저 앱 QR 다운로드 페이지(읽기전용, 중앙 ITSM APK 저장소 재사용)
|
||||
location = /mobile-app {
|
||||
alias /opt/itms/downloads/mobile-app.html;
|
||||
alias /opt/itms/static/mobile-app.html;
|
||||
default_type text/html;
|
||||
}
|
||||
# APK 게시 자산 (매니페스트/QR/다운로드) — publish_app_manifest.sh 로 갱신
|
||||
location = /itms-latest.json {
|
||||
default_type application/json;
|
||||
alias /opt/itms/downloads/itms-latest.json;
|
||||
}
|
||||
location = /itms-apk-qr.png {
|
||||
alias /opt/itms/downloads/itms-apk-qr.png;
|
||||
}
|
||||
location /downloads/ {
|
||||
alias /opt/itms/downloads/;
|
||||
types { application/vnd.android.package-archive apk; }
|
||||
default_type application/octet-stream;
|
||||
add_header Content-Disposition "attachment";
|
||||
}
|
||||
|
||||
# OAuth2 인가서버(:11000) — 모바일 password/refresh grant
|
||||
location /oauth/ {
|
||||
proxy_pass http://127.0.0.1:11000;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_read_timeout 120s;
|
||||
}
|
||||
|
||||
# 업무 REST(:11010, Bearer) vs 프론트 화면(:11020, 세션) — Authorization 헤더로 분기
|
||||
location ~ ^/(main|srm|rem|bbs|cmm|sta|sys|potl)/ {
|
||||
proxy_pass $itms_biz_backend$request_uri;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_read_timeout 120s;
|
||||
}
|
||||
|
||||
# 웹 UI (front :11020) — 브라우저 진입점(기본)
|
||||
# 웹 UI (front :11020) — 브라우저 진입점
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:11020;
|
||||
proxy_set_header Host $host;
|
||||
@ -85,4 +39,15 @@ server {
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_read_timeout 120s;
|
||||
}
|
||||
|
||||
# (선택) OAuth 인가서버 직접 노출이 필요한 구성일 때만 활성화
|
||||
# location /oauth/ {
|
||||
# proxy_pass http://127.0.0.1:11000;
|
||||
# proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme;
|
||||
# }
|
||||
# (선택) API 직접 노출 — front 가 서버측 경유하면 불필요
|
||||
# location /api/ {
|
||||
# proxy_pass http://127.0.0.1:11010;
|
||||
# proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme;
|
||||
# }
|
||||
}
|
||||
|
||||
@ -1,73 +0,0 @@
|
||||
# ITMS CI/CD 파이프라인 정본 (LIVE)
|
||||
|
||||
> 최종 갱신: 2026-07-19 | 상태: **가동 중** (2026-07-17 "산출물 준비형" 판정을 대체)
|
||||
> 상세 실행 기록: `C:\GUARDiA\_workspace\itms_cicd\01~06_*.md` (설계·구축·스키마·모바일·SR·QA)
|
||||
|
||||
## 1. 한 줄 요약
|
||||
|
||||
**`git push` 한 번이면 개발서버 빌드·배포 → 헬스체크 → 운영서버 자동 승격 → QR 페이지까지 자동 처리된다.**
|
||||
|
||||
```
|
||||
git push (Gitea ythong/itms, main)
|
||||
→ Gitea webhook → deploy_server.py itms 블록 (개발서버 101.79.17.164:9999)
|
||||
→ gradle 모듈 빌드 (common 선행 → auth/api/front/batch/datatrans bootWar, JDK17)
|
||||
→ 산출물 아카이브 (/opt/itms/artifacts/current)
|
||||
→ dev 재기동: itms-front + itms-auth + itms-api (systemd)
|
||||
→ dev 헬스체크 게이트 ← 실패 시 여기서 중단 (운영 오염 방지)
|
||||
→ prod 승격: front WAR tar-over-ssh (ssh -p 9271, jenkins 배포키)
|
||||
→ prod 재기동 + 헬스체크 → 완료
|
||||
```
|
||||
|
||||
## 2. 서버·도메인
|
||||
|
||||
| 구분 | 서버 | 도메인 | 기동 범위 | TLS |
|
||||
|------|------|--------|----------|-----|
|
||||
| 개발 | 101.79.17.164 | https://itms.zioinfo.co.kr | front(11020)+auth(11000)+api(11010) — **실로그인 동작** | Let's Encrypt(자동갱신) |
|
||||
| 운영 | 211.37.173.197 (wise.ai.kr, ssh :9271) | https://itms.wise.ai.kr | **front-only** (RAM 게이트) | Let's Encrypt(자동갱신) |
|
||||
|
||||
- 운영서버 211.37.173.197 ITMS 배포는 **2026-07-19 소유자 지정·승인** (CAMP와 동일 서버, Host 헤더 기반 vhost — bare IP 접근은 404).
|
||||
- **운영 RAM 게이트**: prod 총 2GB·가용 ~500MB → front 단일 JVM(-Xmx320m)만. auth/api/DB 운영 기동은 **RAM 증설 후** (그 전 강행 금지 — 기존 WISE/CAMP 운영 서비스 보호).
|
||||
|
||||
## 3. 개발서버 런타임 (Stage B — 로그인 실동작)
|
||||
|
||||
- MariaDB 10.11 + `ur_itms_db` (전용 계정 `itms_zio`) + swap 2G
|
||||
- 스키마: 고객 DDL 부재 → **MyBatis 매퍼 역설계 22테이블** (`_workspace/itms_cicd/03_schema_min.sql`)
|
||||
- 함정1: auth는 `JdbcTokenStore` → `oauth_access_token`/`oauth_refresh_token`/`oauth_approvals` 3테이블 없으면 로그인 자체 실패
|
||||
- 함정2: 로그인 쿼리 = `COMVNUSERMASTER ⋈ TB_USER_CRYP_CNF` INNER JOIN → 두 테이블에 동일 `ESNTL_ID` 시드 필수
|
||||
- 프로파일: 기존 16기관 yml **불변**. 신규 `zio` 프로파일은 서버 외부 config(`/opt/itms/config/application-zio.yml`, `-Dspring.config.additional-location`) — 재빌드 불필요
|
||||
- 시크릿: `/opt/itms/secrets/` (0600) — 데모 admin 비번·DB 비번. 문서/커밋 기재 금지
|
||||
- **nginx Bearer 분기(핵심 함정)**: front와 api가 동일 URL prefix(/main·/srm·/sys 등)를 화면/REST로 각각 사용 → 경로 분기 불가. `Authorization: Bearer` 헤더 map으로 분기: Bearer→api(11010), 세션(브라우저)→front(11020), `/oauth/`→auth(11000). 정본: `deploy/nginx/itms.zioinfo.co.kr.conf`
|
||||
|
||||
## 4. 모바일 앱 · QR 배포
|
||||
|
||||
- 앱: `mobile/` 독립 Expo 앱(SDK 51, TS, 12화면) — Gradle 컴포짓 무관 순수 Node
|
||||
- 인증: OAuth2 password grant `POST /oauth/token`(+Basic client, `ssoYn=N`) → RS256 JWT 24h
|
||||
- 업무 API: 루트 prefix `POST /*.do` + Bearer (`/api` prefix 아님 — `constants/Config.ts` 권위), 응답 봉투 `{data,status,totalCount,code,message}`
|
||||
- QR 다운로드 페이지: dev·prod `/mobile-app` — APK 매니페스트 기반 버전·QR·다운로드 표시
|
||||
- APK: EAS 클라우드 빌드(EXPO_TOKEN 환경변수 — 값 저장 금지)
|
||||
|
||||
## 5. 고객 SR 반영 현황 (2026-07-19 push 53b8f42c)
|
||||
|
||||
- 원본: `docs/ITSM 고객 수정 요청 체크리스트_20260708.xlsx`(25건) + `docs/ITSM 기능개선 및 장애처리_V1.1_20260707.pptx`(15건) + 브랜딩(F12) = 40건
|
||||
- **완료 23건** (로그인 잠금/메시지, 서비스데스크 서버측 권한·검증, 용어 통일 172건, 임시저장 버튼, 로고/파비콘 관리 등) — 개발·운영 라이브 검증 완료
|
||||
- **보류 17건**: 고객 DB 스키마/프로시저 의존·설계 확정 필요·정책 판단 — `docs/SR_BACKLOG_20260708.md` 권고안 포함
|
||||
- 조치 기록(고객 제출용): `docs/ITSM 고객 수정 요청 체크리스트_20260708_조치결과.xlsx` — 쉬운 설명 + **변경 전/후 코드 나란히 비교**
|
||||
- 상세 diff: `docs/SR_CHANGES_20260719.md`
|
||||
|
||||
## 6. 운영 절차 (Runbook)
|
||||
|
||||
| 작업 | 방법 |
|
||||
|------|------|
|
||||
| 배포 | `git push origin main` — 이후 전자동. **push = 운영 배포**이므로 로컬 빌드 게이트(전 모듈 bootWar EXIT 0) 통과 후에만 |
|
||||
| 배포 추적 | dev `journalctl -u zioinfo-deploy -f` (webhook→build→restart→promote 로그) |
|
||||
| 롤백 | dev: `/opt/itms/artifacts/` 이전 아카이브 재기동 / prod: 이전 front WAR 재전송+재기동 |
|
||||
| 헬스 | dev/prod 도메인 HTTP 200 + `systemctl status itms-front itms-auth itms-api` |
|
||||
| deploy_server 수정 | 로컬 정본 `scripts/deploy/deploy_server.py` + 서버 `/opt/zioinfo/deploy_server.py` **양쪽 반영 + zioinfo-deploy 재시작** 필수(미반영 시 웹훅 1ms no-op) |
|
||||
|
||||
## 7. 잔여 백로그
|
||||
|
||||
1. APK 게시: EAS 빌드 완료 → dev/prod `/mobile-app` 매니페스트 갱신 (진행 중)
|
||||
2. 운영 풀스택(로그인): **RAM 증설 결정 대기**
|
||||
3. DB 의존 SR 17건: 고객 `ur_itms_db` 덤프 확보 시 (또는 역설계 확장)
|
||||
4. batch(Oracle XE)·datatrans(기관 NAS): 기관 전용망 확보 시 — CI 빌드·아카이브는 이미 포함
|
||||
5. legacy/nlib: CI 제외 유지(Maven·Java8)
|
||||
@ -1,97 +0,0 @@
|
||||
# ITMS DB 연결 정보 (환경·도메인별)
|
||||
|
||||
> 최종 갱신: 2026-07-19 | 분류: **대외비** — 무단 배포 금지
|
||||
> **보안 불변**: 이 문서에는 **비밀번호·AES 암호문·NCP/카카오 키·Gmail 비번을 기재하지 않는다.** 실값은 서버 로컬(`/opt/itms/secrets/`, `/opt/itms/config/`) 또는 기관 프로파일 yml(AES-256 암호문)에만 존재. 계정/DB명·호스트·URL 템플릿·프로파일 매핑만 기록.
|
||||
> **적용 방식(확정)**: **서버별 프로파일 고정** — 각 서버가 자기 프로파일을 `SPRING_PROFILES_ACTIVE`로 활성화. 도메인 = 서버 = 프로파일 = DB 가 1:1.
|
||||
|
||||
---
|
||||
|
||||
## 1. 도메인 ↔ 서버 ↔ 프로파일 ↔ DB 매핑 (핵심)
|
||||
|
||||
| 환경 | 접속 도메인 | 서버 | 활성 프로파일 | Primary DB | 상태 |
|
||||
|------|------------|------|--------------|-----------|------|
|
||||
| **로컬** | localhost | 개발자 PC | `local` | 고객 내부망 MariaDB(192.168.8.131) | 소스 기본값 |
|
||||
| **개발** | itms.zioinfo.co.kr | 101.79.17.164 | `zio-dev` (외부 config) | dev MariaDB `ur_itms_db`@localhost | **LIVE (로그인·업무 실동작)** |
|
||||
| **운영** | itms.wise.ai.kr | 211.37.173.197 | `zio-prod` (외부 config) | prod DB(프로비저닝 대기) | front-only(RAM 게이트) |
|
||||
| **기관(16종)** | 기관별 도메인 | 기관 서버 | `keiti_prod`·`kic_rel`·`nowon`·… | 기관 망 MariaDB/Oracle | 고객 배포 환경 |
|
||||
|
||||
- 프로파일 활성: 서버의 `/etc/itms/itms-<모듈>.env` 또는 systemd `SPRING_PROFILES_ACTIVE=<프로파일>`.
|
||||
- **16기관 원본 yml 불변** 원칙: dev/prod 전용값은 원본 프로파일을 고치지 않고 **외부 config**(`-Dspring.config.additional-location=/opt/itms/config/application-<프로파일>.yml`)로 오버레이.
|
||||
|
||||
---
|
||||
|
||||
## 2. 데이터소스 상세 (논리 DB별)
|
||||
|
||||
각 모듈이 참조하는 논리 DB. 계정/비번 실값은 **AES-256 암호문(프로파일 내)** 또는 서버 시크릿 — 아래는 논리명·엔진·URL 템플릿만.
|
||||
|
||||
| 논리 DB | 엔진 | 용도 | 사용 모듈 | URL 템플릿(호스트·포트·DB) |
|
||||
|---------|------|------|----------|---------------------------|
|
||||
| `primarydb` | MariaDB | ITMS 본체(업무·인증·메뉴) `ur_itms_db` | api·batch | `jdbc:mariadb://<HOST>:3306/ur_itms_db?characterEncoding=UTF-8&serverTimezone=Asia/Seoul&rewriteBatchedStatements=true` |
|
||||
| `kicinsadb` | Oracle XE | KIC 인사 연동 | batch | `jdbc:oracle:thin:@<HOST>:1521:XE` |
|
||||
| `ncmsdb` | MySQL | NCMS(kccfnova) 데이터 변환 | datatrans | `jdbc:mysql://<HOST>:3307/kccfnova?characterEncoding=UTF-8&serverTimezone=Asia/Seoul` |
|
||||
| `iamsdb` | MySQL | IAMS(uac_cltr_db) 수집 연동 | datatrans | `jdbc:mysql://<HOST>:3307/uac_cltr_db?characterEncoding=UTF-8&serverTimezone=Asia/Seoul` |
|
||||
| (검색) | OpenSearch | 검색 색인(배치 중개) | api·batch | `http://<HOST>:48381` (연동 서버) |
|
||||
|
||||
- 공통 드라이버 래퍼: `net.sf.log4jdbc.sql.jdbcapi.DriverSpy`(log4jdbc, SQL 로깅). 실드라이버: mariadb-java-client·ojdbc·mysql-connector.
|
||||
- Hikari 풀: maximumPoolSize 35 / minimumIdle 2 (개발서버는 RAM 절감을 위해 축소 오버레이 가능).
|
||||
|
||||
---
|
||||
|
||||
## 3. 환경별 접속 (호스트)
|
||||
|
||||
### 3-1. 로컬 (`local` 프로파일) — 고객 내부망 지향
|
||||
- primarydb: `192.168.8.131:3306/ur_itms_db` (대체: 192.168.8.138)
|
||||
- kicinsadb(Oracle): `192.168.8.132:1521:XE`
|
||||
- ncmsdb/iamsdb(MySQL): `192.168.8.138:3307`
|
||||
- 검색: `192.168.8.138:48381`
|
||||
- ※ 개발자 PC에서 고객 내부망 VPN/터널 필요. 계정/비번 = 프로파일 AES 암호문(복호는 `UrpSysKeyMng` keystore).
|
||||
|
||||
### 3-2. 개발 (`zio-dev`) — GUARDiA 인프라
|
||||
- 서버: 101.79.17.164 / 도메인: itms.zioinfo.co.kr
|
||||
- primarydb: `127.0.0.1:3306/ur_itms_db` (MariaDB 10.11, 서버 로컬, **lower_case_table_names=1** — 2026-07-23 원본 서버와 동일하게 전환)
|
||||
- 계정: `itms_zio` (비번 = 서버 시크릿, 문서 미기재)
|
||||
- 실 스키마: **완전 덤프 적재본(2026-07-23)** — ur_itms_db 73테이블(트리거·함수·프로시저 포함, tb_menu_info/tb_pgm_list 원본) + 별도 DB `ur_itms_rel_db` 211테이블(itms_zio 권한 미부여). 역설계 이전본 백업: 서버 `/root/ITSM_DB/backup_ur_itms_db_pre_restore_*.sql.gz`
|
||||
- Oracle/NCMS/IAMS: 미연결(batch/datatrans 부분 보류) · 검색(OpenSearch): 디스크 게이트로 보류
|
||||
- 외부 config: `/opt/itms/config/application-zio-dev.yml` (원본 16기관 yml 불변)
|
||||
|
||||
### 3-3. 운영 (`zio-prod`) — wise.ai.kr
|
||||
- 서버: 211.37.173.197 / 도메인: itms.wise.ai.kr
|
||||
- 현재: **front-only**(DB 미기동, RAM ~500MB 게이트). primarydb 프로비저닝은 RAM 증설 후.
|
||||
- 외부 config: `/opt/itms/config/application-zio-prod.yml` (프로비저닝 시 작성)
|
||||
|
||||
### 3-4. 구버전(레거시 원본 고객 시스템)
|
||||
> ITMS 통합 전 원본 시스템. 실 스키마·데이터 출처(2026-07-19 소유자 제공 덤프).
|
||||
|
||||
| 항목 | 값 |
|
||||
|------|-----|
|
||||
| DB명 | `mmsdb` (MariaDB) — 업무 스키마 CM_*(IN_/VC_/TX_/DT_ 접두), MyISAM/utf8mb3 |
|
||||
| 계정 | root (비번 = 서버 시크릿, 문서 미기재) |
|
||||
| 인사 연동 | Oracle XE (KIC 인사) |
|
||||
| 변환 대상 | NCMS `kccfnova` · IAMS `uac_cltr_db` (MySQL 3307) |
|
||||
| 프로시저/함수 | `PROC_APPROVAL`·`PROC_REJECT`·`PROC_REQ_APPROVAL`·`FUNC_HOLIDAYS` (+트리거·5번째 프로시저는 덤프 미포함) |
|
||||
| 구 점검 시스템 | `user_info`·`equipment_info` 등(MSS ddl/schema.sql) — 현행 api 미참조 |
|
||||
| 덤프 위치 | `C:\urITSM\wise-ai-platform\urITSM\{mms_data, MSS ddl}` |
|
||||
|
||||
---
|
||||
|
||||
## 4. 프로파일 활성 절차 (서버별 고정)
|
||||
|
||||
```bash
|
||||
# 개발서버(101.79.17.164)
|
||||
/etc/itms/itms-api.env: SPRING_PROFILES_ACTIVE=zio-dev
|
||||
# 운영서버(211.37.173.197)
|
||||
/etc/itms/itms-front.env: SPRING_PROFILES_ACTIVE=zio-prod
|
||||
# 기동 시 외부 config 로드
|
||||
-Dspring.config.additional-location=/opt/itms/config/application-${PROFILE}.yml
|
||||
```
|
||||
- 각 서버는 **자기 프로파일만** 활성 → 도메인 접속 시 해당 서버의 DB로 자동 연결(도메인=서버=프로파일=DB 1:1).
|
||||
- 원본 16기관 프로파일 파일은 수정하지 않음(classpath 상주, 기관 배포용).
|
||||
|
||||
---
|
||||
|
||||
## 5. 보안 주의 (필독)
|
||||
|
||||
- **이 문서·로그·커밋에 비밀번호/AES 암호문/NCP·카카오 키/Gmail 비번 기재 금지.** 실값은 서버 시크릿·AES 암호문에만.
|
||||
- ★**기존 노출 경고(로테이션 권고)**: `batch`/`datatrans`의 `application-local.yml` 에 카카오 알림톡 NCP `accessKey`/`secretKey`·Gmail 비번이 **평문 커밋** 상태. 키 교체(rotation) + 프로파일 암호문화 권고.
|
||||
- 내부 IP(192.168.8.x)는 기존 프로파일에 이미 커밋된 값이라 본 문서에 표기(신규 노출 아님). 외부 배포 금지.
|
||||
- env·keystore 권한 600, 소유자 서비스계정(itms).
|
||||
@ -1,112 +0,0 @@
|
||||
# ITMS DB 덤프(백업) 가이드
|
||||
|
||||
> 최종 갱신: 2026-07-21 | 분류: **대외비** — 무단 배포 금지
|
||||
> **보안 불변**: 이 문서에 **비밀번호·AES 암호문·DB root 비번을 기재하지 않는다.** 실값은 서버 시크릿·키스토어·DBA에게서만 조달.
|
||||
> 대상 예시는 **KIC 운영 프로파일(`application-kic_rel.yml`)** 기준. 다른 프로파일은 호스트/DB명만 바꿔 동일 적용.
|
||||
|
||||
---
|
||||
|
||||
## 0. 대상 DB 요약
|
||||
|
||||
| 항목 | 값 | 출처 |
|
||||
|------|-----|------|
|
||||
| 엔진 | MariaDB | `application-kic_rel.yml` |
|
||||
| Host / Port | `192.10.10.203` / `3306` | (KIC **기관 내부망**) |
|
||||
| DB명 | `ur_itms_rel_db` | primarydb.jdbcUrl |
|
||||
| 앱 계정 | yml에 AES-256-CBC 암호문 | `primarydb.username` / `primarydb.password` |
|
||||
| 복호 키 | `api/src/main/resources/secrets/UrpSystem.keystore` 의 `aes256.key` (IV=키 앞 16바이트) | `Aes256Cipher` |
|
||||
|
||||
- `192.10.10.203`은 **KIC 기관 내부망** 주소 → **KIC 망에 VPN/터널로 접근 가능한 위치에서만** 덤프 가능.
|
||||
- 개발서버 로컬 DB(`ur_itms_db`@101.79.17.164)와는 **다른 DB**임에 주의.
|
||||
- ⚠ front 모듈만 키스토어가 다름(`UrpSysKeyMng.keystore`). api/batch/datatrans는 공용 `UrpSystem.keystore`.
|
||||
|
||||
---
|
||||
|
||||
## 1. 앱 계정으로 덤프
|
||||
|
||||
### 1-A. DBeaver
|
||||
|
||||
1. 새 연결 → **MariaDB**
|
||||
2. **Main 탭**: Host `192.10.10.203`, Port `3306`, Database `ur_itms_rel_db`, User/Password = 복호화한 앱 계정 값
|
||||
- KIC 망 직접 접근 불가 시 **SSH 탭**에서 경유 점프 호스트를 터널로 지정
|
||||
3. **Test Connection** 으로 확인
|
||||
4. 좌측 트리 `ur_itms_rel_db` 우클릭 → **Tools → Dump database**
|
||||
5. 옵션: **Add routines / Add triggers 체크** (레거시에 `PROC_APPROVAL`·`FUNC_HOLIDAYS` 등 존재) → 출력 파일 지정 → **Start**
|
||||
|
||||
> DBeaver는 로컬 PC에 설치된 `mysqldump`(또는 MariaDB `mariadb-dump`) 실행 파일을 호출한다. 없으면 MariaDB 클라이언트 설치 후 연결 설정의 **Local Client** 경로 지정.
|
||||
|
||||
### 1-B. 서버/CLI (KIC 망 접근 가능한 호스트)
|
||||
|
||||
```bash
|
||||
mysqldump -h 192.10.10.203 -P 3306 -u <앱계정> -p \
|
||||
--single-transaction --routines --triggers --events \
|
||||
--default-character-set=utf8mb4 \
|
||||
ur_itms_rel_db | gzip > ur_itms_rel_db_$(date +%Y%m%d).sql.gz
|
||||
```
|
||||
|
||||
- `-p` **프롬프트**에 비번 입력. `-p<pw>`로 붙이면 프로세스 목록/셸 히스토리에 노출되니 금지.
|
||||
|
||||
---
|
||||
|
||||
## 2. root 계정으로 덤프
|
||||
|
||||
앱 계정은 특정 DB에만 권한이 있을 수 있으나 **MariaDB root**는 전권이라 프로시저·트리거·이벤트까지 확실히 받는다.
|
||||
|
||||
### 2-A. DB 서버에 SSH 로그인 후 로컬 실행 (권장·가장 확실)
|
||||
|
||||
```bash
|
||||
# DB 서버 안에서 (localhost 접속 → 네트워크 이슈 없음)
|
||||
mysqldump -u root -p \
|
||||
--single-transaction --routines --triggers --events \
|
||||
--default-character-set=utf8mb4 \
|
||||
ur_itms_rel_db | gzip > /tmp/ur_itms_rel_db_$(date +%Y%m%d).sql.gz
|
||||
```
|
||||
|
||||
로컬로 가져오기:
|
||||
|
||||
```bash
|
||||
scp <계정>@192.10.10.203:/tmp/ur_itms_rel_db_20260721.sql.gz .
|
||||
```
|
||||
|
||||
### 2-B. 원격에서 root로 직접 접속
|
||||
|
||||
```bash
|
||||
mysqldump -h 192.10.10.203 -P 3306 -u root -p \
|
||||
--single-transaction --routines --triggers --events \
|
||||
--default-character-set=utf8mb4 \
|
||||
ur_itms_rel_db | gzip > ur_itms_rel_db_$(date +%Y%m%d).sql.gz
|
||||
```
|
||||
|
||||
- ⚠ MariaDB root는 보통 `root@localhost`(unix_socket/localhost 한정)로만 열려 원격 접속이 막힌 경우가 많다. `Access denied for user 'root'@'<내IP>'` 발생 시 **2-A(서버 로컬 실행)** 또는 **앱 계정**으로 전환.
|
||||
|
||||
### 2-C. DBeaver에서 root
|
||||
|
||||
1. 연결 편집 → User `root`, Password = **MariaDB root 비번**
|
||||
2. `ur_itms_rel_db` 우클릭 → **Tools → Dump database** → Add routines/triggers 체크 → **Start**
|
||||
|
||||
---
|
||||
|
||||
## 3. 자주 쓰는 변형 옵션
|
||||
|
||||
| 목적 | 옵션 |
|
||||
|------|------|
|
||||
| 스키마만(데이터 제외) | `--no-data` |
|
||||
| 데이터만(DDL 제외) | `--no-create-info` |
|
||||
| 특정 테이블만 | `... ur_itms_rel_db TABLE1 TABLE2` |
|
||||
| 특정 테이블 제외 | `--ignore-table=ur_itms_rel_db.TABLE` |
|
||||
| MyISAM 정합성 | `--single-transaction`은 InnoDB 전용. MyISAM 섞이면 서비스 정지 또는 `--lock-tables` 검토 |
|
||||
|
||||
**복원(참고)**
|
||||
|
||||
```bash
|
||||
gunzip < ur_itms_rel_db_20260721.sql.gz | mysql -u root -p ur_itms_rel_db
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 비밀번호/자격증명 조달
|
||||
|
||||
- **앱 계정 비번**: `application-kic_rel.yml`의 AES-256-CBC 암호문 → `UrpSystem.keystore`의 `aes256.key`로 복호. **이 문서·커밋·로그에 평문 기재 금지.**
|
||||
- **MariaDB root 비번**: yml/키스토어에 없음 → **KIC DB 서버 관리자(DBA) 또는 서버 시크릿**에서 조달.
|
||||
- **OS root SSH**: DB root(계정)와 별개. GUARDiA 보안 규칙상 기관 서버는 root SSH 직접 접속 금지(opsagent 계정 사용) — KIC 서버 정책 준수.
|
||||
- 참고: 이 프로파일에는 Gmail 발송 계정 비번도 암호문으로 포함. `DB_CONNECTIONS.md`에 **키 로테이션 권고** 기록됨 — 덤프와 별개로 자격증명 노출 관리 필요.
|
||||
@ -1,64 +0,0 @@
|
||||
# ITMS 작업 인수인계 (핸드오프)
|
||||
|
||||
> 최종 갱신: 2026-07-23 | 다른 PC에서 이어서 작업하기 위한 현황·다음단계 정리
|
||||
> 관련 문서: `CICD_PIPELINE.md`(배포) · `DB_CONNECTIONS.md`(DB 매핑) · `ITMS_INSTALL_RUNBOOK.md`(설치) · `SR_BACKLOG_20260708.md`/`SR_CHANGES_20260719.md`(고객 SR)
|
||||
|
||||
## 1. 지금까지 완료 (LIVE)
|
||||
|
||||
- **CI/CD 파이프라인**: `git push` → 개발(itms.zioinfo.co.kr) 빌드·배포 → 헬스게이트 → 운영(itms.wise.ai.kr) 자동 승격. push 자동연쇄 검증 완료.
|
||||
- **개발서버(itms.zioinfo.co.kr) 실동작**: 로그인 → 메인 → 서비스데스크/자산/보고서 조회·검색 → **SR 신청 등록**(DB insert) → **결재 승인/반려**(프로시저) → **검색**(OpenSearch 9201 색인). 실 고객 데이터.
|
||||
- **운영서버(itms.wise.ai.kr)**: front-only(데모). 로그인 등 풀스택은 RAM 게이트.
|
||||
- **고객 SR 40건**: 23건 완료·배포(로그인 잠금·서비스데스크 권한/검증·용어통일·브랜딩 F12·결재). 조치결과 엑셀+diff 문서 산출.
|
||||
- **모바일 앱**: Expo 12화면 + APK v1.0.0 게시(/mobile-app QR, dev·prod).
|
||||
- **도메인별 프로파일 고정**: zio-dev(개발)·zio-prod(운영), 16기관 yml 불변.
|
||||
|
||||
## 2. ★ 완전한 ur_itms_db 덤프 적재 — ✅ 완료 (2026-07-23)
|
||||
|
||||
**2026-07-22 소유자 제공 완전 덤프(192.10.10.203, MariaDB 11.7.2)를 2026-07-23 개발서버에 적재 완료.**
|
||||
|
||||
- 덤프 위치(로컬): `workspace/itms/ITSM_DB/` (root 계정본이 정본, gitignore 대상 — 커밋 금지) / 서버: `/root/ITSM_DB/`
|
||||
- `ur_itms_db` 73테이블(트리거 11·함수 2·프로시저 3 포함, **tb_menu_info 63행·tb_pgm_list 58행** — 포털계층 원본 확보) → 기존 역설계 DB **백업 후 대체**(`/root/ITSM_DB/backup_ur_itms_db_pre_restore_*.sql.gz`)
|
||||
- `ur_itms_rel_db` 211테이블 신규 적재(운영 DB 프로비저닝 시 이관 예정, itms_zio 권한 미부여 상태)
|
||||
- **서버 설정 변경**: 원본이 대소문자 무시라 덤프 테이블명이 소문자·앱 SQL은 대문자 → `lower_case_table_names=1` 적용(`/etc/mysql/mariadb.conf.d/99-itms-lower-case.cnf`) + MariaDB 재시작. csv DB(188테이블) 무영향 확인
|
||||
- DEFINER `uritms_usr01`(미존재 계정)은 로드 시 `CURRENT_USER`로 치환
|
||||
- 적재 후 auth/api/front 정상 응답·사이트 200 확인. **잔여 검증: 로그인→메뉴→서브메뉴→페이지 전수 회귀**
|
||||
- ⚠ 적재 후 디스크 98%(여유 ~2.5GB) — 정리 필요 시 서버측 덤프 gz(119MB)부터
|
||||
|
||||
### (이력) 원래 계획 — 완전한 ur_itms_db 덤프 적재 (근본 해결)
|
||||
|
||||
**핵심 발견**: 받은 덤프(`mms_data`/`MSS ddl`)에는 **`cm_*` 업무 데이터만** 있고, 배포된 ITMS(urpsys/eGov)가 메뉴·화면을 읽는 **포털계층 테이블(TB_MENU_INFO·TB_PGM_LIST·TB_PORTLET·COMVNUSERMASTER·권한/사용자)이 0개**. → 그 테이블들을 역설계 빈 껍데기로 때워왔고, 그래서 **메뉴 URL 없음·서브메뉴 안 뜸·일부 페이지 500** 이 반복됨.
|
||||
|
||||
**소유자 확인(2026-07-20): 완전한 ur_itms_db 덤프 제공 가능.** 이걸 받으면:
|
||||
```
|
||||
# 원본 서버에서 (프로시저·트리거 포함)
|
||||
mysqldump -u root -p --routines --triggers --single-transaction --default-character-set=utf8mb4 ur_itms_db > ur_itms_db_full.sql
|
||||
```
|
||||
→ 개발서버 **격리 DB**(ur_itms_db)에 적재 → zio-dev 연결 → **역설계 포털 테이블 전량 대체** → 메뉴·URL·서브메뉴·페이지가 **원본대로** 동작. 지금까지의 역설계 땜질(09_menu.sql 등)은 이 덤프가 대체.
|
||||
|
||||
**대안(방법 B)**: 원본 DB 직접 연결 — 단 ①개발서버(101.79.17.164)에서 네트워크 도달 가능해야 하고(내부망 192.168.8.x면 VPN/터널 필요) ②테스트 쓰기가 원본 운영 데이터를 오염시키므로 복제본/읽기전용 권장. → **격리 덤프 적재(방법 A)가 안전.**
|
||||
|
||||
**진행 중이던 역설계(메뉴 페이지 드리프트)는 이 덤프 도착 시 중단·대체** — 헛수고 방지를 위해 보류 상태.
|
||||
|
||||
## 3. 잔여 (외부자원 게이트 — 소프트웨어는 완료)
|
||||
|
||||
| 항목 | 게이트 | 비고 |
|
||||
|------|--------|------|
|
||||
| 관리자 백오피스 페이지 500 | (2)의 완전 덤프로 대부분 해소 예상 | 포털계층 테이블 부재가 원인 |
|
||||
| 운영서버 풀스택 로그인 | RAM 증설/서버 분리 | prod 가용 ~466MB, WISE/CAMP 상용 보호 |
|
||||
| batch JVM 상시기동 | Oracle 인사망+NCP키+Quartz 잡설정 | 검색 색인은 어댑터로 대체 완성 |
|
||||
| URP 검색 마이크로서비스 정품 | 운영 배포본 | 현재 dev 어댑터가 대체(계약 동일) |
|
||||
| Stitch UI 시안(#6) | 새 세션에서 MCP 로드 | `.mcp.json` 등록됨 |
|
||||
|
||||
## 4. 다른 PC에서 이어가기
|
||||
|
||||
1. **clone**: `git clone <Gitea>/ythong/itms` (또는 pull). 소스·docs 최신(이 커밋 포함).
|
||||
2. **고객 데이터는 Gitea에 없음**(보안). `mms_data`·`MSS ddl`·완전 덤프는 **별도 안전 경로**(USB/직접전송)로 가져올 것 — 커밋 금지.
|
||||
3. **Stitch MCP**: `workspace/itms/.mcp.json`(gitignore됨, 로컬 전용) 재생성 필요 시 키 재등록.
|
||||
4. **서버 접근**: 개발 101.79.17.164 / 운영 211.37.173.197(ssh :9271). 자격증명은 서버 시크릿(`/opt/itms/secrets/`)·로컬 관리, 문서 미기재.
|
||||
5. **작업 재개 지점**: §2 완전 덤프 적재부터. 덤프 확보 → 개발서버 ur_itms_db에 적재 → zio-dev 검증(로그인→메뉴→서브메뉴→페이지 전수) → 회귀 확인.
|
||||
|
||||
## 5. 서버·배포 요약
|
||||
|
||||
- 개발: 101.79.17.164 — front:11020·auth:11000·api:11010, MariaDB(ur_itms_db)·OpenSearch(9201)·검색어댑터(48381). systemd `itms-*`.
|
||||
- 운영: 211.37.173.197 — itms-front(zio-prod). nginx Host 기반 vhost.
|
||||
- 배포: Gitea webhook → deploy_server itms 블록(dev 빌드→헬스→prod 승격). deploy_server 수정 시 서버 `/opt/zioinfo/` 사본 반영+재시작 필수.
|
||||
@ -1,104 +0,0 @@
|
||||
# ITMS 설치 실전 런북 (전체 스택)
|
||||
|
||||
> 최종 갱신: 2026-07-19 | 정본 = 이 문서 + `install/`(스크립트) + `docs/ITMS_서버설치가이드.docx`(기본 4-WAR 절차)
|
||||
> 이 런북은 설치가이드(4-WAR)에 **실전 운영 절차**(OpenSearch 검색·Docker·배치/Quartz·프로시저/트리거·업로드 경로·방화벽·통합 테스트)를 합친 것이다. 소유자 제공 설치 노트(2026-07-19) 반영.
|
||||
> 보안: 접속정보·비밀번호·keystore 비번·연동 키를 로그/문서/커밋에 노출 금지. env·keystore 권한 600, 소유자 서비스계정.
|
||||
|
||||
## 0. 시스템 구성 (실전 파악)
|
||||
|
||||
ITMS 는 4-WAR(auth:11000·api:11010·front:11020·batch:11030) + datatrans 데몬 + **검색엔진(OpenSearch)** 으로 구성된다.
|
||||
- **검색 경유**: 목록/조회 검색은 OpenSearch 색인을 탄다. **배치(Quartz)가 DB ↔ OpenSearch 색인을 중개**한다("검색이 되면 배치도 도는 것" = 배치가 색인을 갱신하므로 검색 성공 = 배치 정상). api ↔ 배치 ↔ 검색 간 데이터가 오간다.
|
||||
- **DB 프로시저/함수/트리거**: 결재·업무 로직 일부가 DB 프로시저/함수/트리거로 구현(`PROC_APPROVAL`·`PROC_REJECT`·`PROC_REQ_APPROVAL`·`FUNC_HOLIDAYS` 등 5개 + 트리거). 스키마 적재만으로 부족 — 반드시 등록.
|
||||
- **Docker**: OpenSearch(및 부속)를 Docker 로 기동. 디스크 부족 시 Docker 루트 디렉터리 이전 필요.
|
||||
|
||||
## 1. 사전 요구 (Feasibility Gate — 설치 전 실측)
|
||||
|
||||
| 항목 | 요구 | 미충족 시 |
|
||||
|------|------|----------|
|
||||
| OS/systemd | Linux | — |
|
||||
| JDK17 | 빌드·런타임 공통 (Boot 2.6.2 Java21 미지원) | apt `openjdk-17-jdk` / dnf `java-17-openjdk-devel` |
|
||||
| 메모리 | **4GB+ 권장** (4 WAR + 데몬 + **OpenSearch 1~2GB**) | ★게이트: 부족 시 모듈 축소 기동 or 서버 분리 |
|
||||
| 디스크 | 빌드·아티팩트·로그·**OpenSearch 인덱스·Docker 이미지** 여유 | ★Docker 루트 이전(§4) |
|
||||
| MariaDB | `ur_itms_db` (api/batch 필수) | 설치·적재(§3) |
|
||||
| Oracle XE | batch 인사 연동 | 미도달 시 batch 부분 보류 |
|
||||
| **OpenSearch** | 검색 백엔드(Docker) | 미기동 시 검색·배치 검증 불가 |
|
||||
| JDBC 드라이버 | **Oracle ojdbc 등은 Maven 미제공 → 설치 파일로 동봉·수동 배치** | 빌드/기동 실패 |
|
||||
| 네트워크 | 11000/11010/11020/11030 + OpenSearch 포트 개방 | §9 방화벽 |
|
||||
| 시크릿 | 기관 `application-<기관>.yml` · keystore(UrpSystem/UrpSysKeyMng) | 사전 확보 |
|
||||
|
||||
## 2. 패키지·계정·디렉터리·systemd
|
||||
|
||||
```bash
|
||||
tar xzf itms-install-*.tar.gz && cd itms-install
|
||||
sudo bash preflight.sh # JDK17·DB 도달·디스크 점검
|
||||
sudo dnf install -y java-17-openjdk-devel # (미설치 시)
|
||||
sudo bash install.sh # itms 계정·/opt/itms·/etc/itms·systemd 유닛(멱등). start 안 함
|
||||
```
|
||||
|
||||
## 3. DB 준비 (MariaDB `ur_itms_db`)
|
||||
|
||||
1. **스키마 적재**: 실제 고객 스키마 `mmsdb` CM_* DDL(`note1.txt`) → `ur_itms_db`. charset utf8(mb3/mb4) 한글 정합.
|
||||
2. **데이터 적재**: `mms_data/*.csv` (테이블명_날짜.csv) → 대응 테이블(LOAD DATA/mysqlimport, 인코딩·NULL 확인).
|
||||
3. **프로시저/함수 5개** (DBeaver 또는 mysql): `note3.txt` 의 `PROC_APPROVAL`·`PROC_REJECT`·`PROC_REQ_APPROVAL`·`FUNC_HOLIDAYS`(+잔여 1) — **함수명/DELIMITER 정확히**.
|
||||
4. **트리거 생성**: **테이블명·함수명 정확히 매칭**하여 트리거 등록(DBeaver: 테이블 좌클릭 → 트리거 생성). note/DDL의 트리거 정의 기준.
|
||||
5. **업로드 파일 경로**: 첨부/업로드 저장 경로를 DB 설정에 반영(파일 저장 루트를 서버 실제 경로로).
|
||||
6. 인덱스(`note2.txt`/`index.sql`) 적용.
|
||||
7. 로그인 계층(포털: COMVNUSERMASTER·TB_*·oauth)은 실 dump에 없으면 역설계본 유지(로그인 동작 보존). CM_*가 실 dump 권위.
|
||||
|
||||
## 4. Docker + OpenSearch (검색)
|
||||
|
||||
1. Docker 설치·기동. **디스크 부족 시 Docker 루트 디렉터리 이전**:
|
||||
- `/etc/docker/daemon.json` 에 `{"data-root": "/data/docker"}` → `systemctl restart docker` (기존 이미지 이전 or 재pull).
|
||||
2. OpenSearch 컨테이너 기동(메모리 `-Xms/-Xmx` 서버 여유 내로 제한, 예 512m~1g). 보안플러그인/포트 설정.
|
||||
3. **Dev Tools 테스트**: OpenSearch Dashboards Dev Tools 진입 → 쿼리 입력 후 **Ctrl+Enter** 로 실행, 인덱스/검색 응답 확인.
|
||||
|
||||
## 5. 아티팩트 빌드 (온라인 필요)
|
||||
|
||||
- **컴파일 시 온라인**(gradle 배포판·의존성 다운로드 — 콜드 빌드 1회 워밍). CI(방법 B) 또는 `deploy/build.sh`(JDK17).
|
||||
- **JDBC 드라이버**: Oracle ojdbc 등 Maven 미제공 드라이버는 **설치 파일로 동봉**해 빌드 classpath/lib 에 배치.
|
||||
- 산출물 `*/build/libs/itms-<모듈>.war` → `/opt/itms/artifacts/current/`.
|
||||
|
||||
## 6. 설정 파일 수정 (폴더·IP·Yaml·Quartz)
|
||||
|
||||
1. **폴더·IP 정합**: 각 `application-<기관>.yml` 및 설정의 경로/호스트를 **대상 서버 폴더·IP 로 정확히 수정**.
|
||||
2. **Quartz property**: 배치 스케줄러 property(잡·데이터소스·색인 대상) 값 변경.
|
||||
3. **설치 정보 파일** 수정(설치 메타/버전/경로).
|
||||
4. **프로파일 파일명 쉘 반영**: §6-1에서 수정한 프로파일 파일명을 기동 쉘/env `SPRING_PROFILES_ACTIVE` 에 동일하게 반영(파일명↔쉘 불일치 시 미기동).
|
||||
|
||||
## 7. 기동 (순서 준수)
|
||||
|
||||
```bash
|
||||
# /etc/itms/itms-<모듈>.env: SPRING_PROFILES_ACTIVE=<기관>, JAVA_OPTS=-Xms256m -Xmx512m
|
||||
sudo systemctl daemon-reload
|
||||
# 순서대로 올리고 각 단계 프로세스 확인
|
||||
for m in auth api front batch datatrans; do sudo systemctl enable --now itms-$m; sleep 3; systemctl is-active itms-$m; done
|
||||
```
|
||||
|
||||
## 8. 방화벽 (Linux)
|
||||
|
||||
- 내부 포트 11000/11010/11020/11030 + OpenSearch 포트 개방(firewalld/ufw). 외부는 리버스 프록시(HTTPS)만 노출.
|
||||
|
||||
## 9. 최종 점검 (통합 테스트)
|
||||
|
||||
| # | 항목 | 기대 |
|
||||
|---|------|------|
|
||||
| 1 | **down/start 쉘 동작** | 중지·기동 쉘 정상, 프로세스 up/down 반영 |
|
||||
| 2 | 헬스 | 11000/11010/11020 200, batch/datatrans 로그 라이브 |
|
||||
| 3 | **SR 신청 1건** | 등록 성공(DB insert 확인) |
|
||||
| 4 | **검색** | SR/자산 검색 결과 노출 = **배치 색인 정상**(검색되면 배치도 도는 것) |
|
||||
| 5 | **통합 테스트** | 로그인→메인→SR 등록→결재(프로시저)→검색→보고서 흐름 |
|
||||
| 6 | **자산 대용량 처리** | 대량 자산 조회/색인 성능·오류 확인 |
|
||||
| 7 | 배치 중개 | 배치가 DB↔검색(AP) 데이터 왕복 정상 |
|
||||
|
||||
## 10. 테스트 자격
|
||||
|
||||
- MariaDB root, 테스트 계정 `admin` — 값은 서버 로컬/시크릿 저장소에서만 조달, 이 문서·로그·커밋에 미기재.
|
||||
|
||||
## 11. 트러블슈팅
|
||||
|
||||
- 기동 즉시 종료 → `journalctl -u itms-<모듈>` (DB 미도달/프로파일 오류).
|
||||
- `gradlew` 127 → CRLF: `sed -i 's/\r$//' gradlew`.
|
||||
- front 빌드 실패 → egov `spring-modules-validation`(artifact-only 저장소) 배선 확인.
|
||||
- webhook 미동작 → url localhost·secret 일치·ALLOWED_HOST_LIST loopback + deploy_server 서버 사본 반영·재시작.
|
||||
- Docker 디스크 부족 → data-root 이전(§4-1).
|
||||
- 검색 무결과 → 배치 색인 잡 확인(Quartz property·OpenSearch 도달).
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,86 +0,0 @@
|
||||
# ITMS 고객(KIC) 수정요청 백로그 — 2026-07-08 접수 / 2026-07-19 처리
|
||||
|
||||
> 근거: `docs/ITSM 고객 수정 요청 체크리스트_20260708.xlsx`(체크리스트 25건 + 이미지) · `docs/ITSM 기능개선 및 장애처리_V1.1_20260707.pptx`(기능개선 11 + 장애처리 4) · 소유자 추가지시 F12(브랜딩)
|
||||
> 대상: URP ITMS 모노레포(`workspace/itms`) — auth / api / front / common
|
||||
> 판정 구분: **즉시구현**(코드로 바로 처리) · **설계필요**(신규기능·상태전이 등 설계 선행) · **검토제안**(정책 판단 필요, 안전기본으로 처리) · **DB의존**(런타임 DB/스토어드프로시저/템플릿 데이터 필요)
|
||||
|
||||
---
|
||||
|
||||
## A. 체크리스트 25건 (xlsx)
|
||||
|
||||
| # | 구분 | 요약 | 대상 모듈·파일 | 난이도 | 판정 | 상태 |
|
||||
|---|------|------|----------------|--------|------|------|
|
||||
| 1 | 로그인 | 잠긴 계정 비밀번호 초기화 차단 + 메일 미발송 결함 | api `baseapi/main/MainController`·`itmsapi/sys/UserManageController` / front `PopPasswordReset.jsp` | 중 | 즉시구현 | 완료 |
|
||||
| 2 | 로그인 | 잠금 메시지 문구 교체(시스템관리자 성명·호칭 동적) | front `basefront/MainController` + `custom.adminName/adminTitle` | 하 | 즉시구현 | 완료 |
|
||||
| 3 | 로그인 | 아이디/패스워드 오입력 메시지(잠금과 구분) | front `basefront/MainController` | 하 | 즉시구현 | 완료 |
|
||||
| 4 | 사용자관리 | 사용자 조회 시 원소속 부서로 표기 | api `UserSearchMapper.xml`(`TB_TASK_USER_INFO.ORG_ID`) | 중 | DB의존 | 보류 |
|
||||
| 5 | 서비스데스크 | SR 프로세스 명확화(결재라인 처리자 포함·반려 이전단계 복귀·단계별 메일 7종) | api `SvcDeskService`·`SvcDeskMapper.xml`(스토어드프로시저)·`CmmUseController` 메일 / DB 템플릿 `SM_003` | 상 | 설계필요·DB의존 | 부분 |
|
||||
| 6 | 서비스양식 | 빈양식 외 양식 작성(장애/이슈보고), SR기본요청양식, 서버점검양식 문구/행높이 | api 서비스양식 DB(`CM_SERVICE` 템플릿) | 중 | DB의존 | 보류 |
|
||||
| 7 | 이슈보고 | "등록" 버튼 → "임시저장" | front `Report*Insert.jsp`·`Report*CopyInsert.jsp` | 하 | 즉시구현 | 완료 |
|
||||
| 8 | 이슈보고 | 중복 "새로만들기" 버튼 제거 | front `ReportIssueDetail.jsp` | 하 | 즉시구현 | 완료 |
|
||||
| 9 | 서비스데스크 | 조치예정자 사용자 직접선택 차단(신청) + 접수자/접수일시 서버제어(접수) | front `SvcDeskReqInsert.jsp` / api `SvcDeskController.addIncident` | 중 | 즉시구현 | 완료(완료요청일시 유지) |
|
||||
| 10 | 서비스데스크 | 등록/승인요청 vs 등록 버튼 구분("등록"→"임시저장") | front `SvcDeskInsert.jsp`·`SvcDeskCopyInsert.jsp` | 하 | 즉시구현 | 완료 |
|
||||
| 11 | 서비스데스크 | 텍스트 줄바꿈이 밀리는 현상 | front CSS(해당 화면 재현 필요) | 중 | 검토제안 | 보류(재현필요) |
|
||||
| 12 | 서비스데스크 | 입력값 길이 예외처리 + "장애페이지 후 등록되는 이중 결함" | api `SvcDeskController`·`SvcDeskReqController` / front `SvcDeskController`·JSP | 중 | 즉시구현 | 완료 |
|
||||
| 13 | 서비스데스크 | 에디터 높이 무한 증가 → 최대높이/스크롤 | front `tinymce_uritms_setting.js` | 하 | 즉시구현 | 완료 |
|
||||
| 14 | 서비스데스크 | 신청번호 부분검색(와일드카드) | api `SvcDeskReqMapper.xml` | 하 | 즉시구현 | 완료 |
|
||||
| 15 | 서비스데스크 | 결재 단계별 알림 발송 여부 점검 | api `CmmUseController`/`HtmlEmailUtil` + batch 발송 · SMTP | 중 | DB의존·설계 | 부분(SR5와 통합) |
|
||||
| 16 | 서비스데스크 | 일반 사용자는 본인 신청건만 조회 | api `SvcDeskReqController`·`SvcDeskReqMapper.xml` | 중 | 즉시구현 | 완료 |
|
||||
| 17 | 서비스데스크 | 접수번호 노출 필요성 검토 | front 신청 목록/상세 JSP | 하 | 검토제안 | 검토(유지 권고) |
|
||||
| 18 | 서비스데스크 | 서비스데스크 메뉴 등록 버튼 일반 사용자 비노출 | 메뉴 권한(DB) / front `SvcDeskList.jsp` | 중 | 검토제안 | 검토(메뉴권한 권고) |
|
||||
| 19 | 공통 | 오타 "없무권한" → "업무권한" | front `error/errorNoAuth.jsp` | 하 | 즉시구현 | 완료 |
|
||||
| 20 | 공통 | "인스턴트"(인스던트/인시던트) → "서비스" 용어 통일 | front 전 화면(48파일 172건) | 중 | 즉시구현 | 완료 |
|
||||
| 21 | 업무게시판 | 메인 카드 vs 메뉴 진입 화면 상이 | front `taskPortlet2.jsp`(고정 bbsId) vs 메뉴(DB) | 중 | 검토제안·DB의존 | 검토(정렬 권고) |
|
||||
| 22 | 시스템관리 | 자동로그인 시 시스템관리 메뉴 필요성 | 메뉴/권한(DB) | 하 | 검토제안 | 검토(비노출 권고) |
|
||||
| 23 | 메인페이지 | 메인 필요성 + FOOTER 레이아웃 | front `IncFooter.jsp` | 하 | 검토제안 | 부분(오타수정·유지 권고) |
|
||||
| 24 | 메인페이지 | 통합검색 결과 권한 필터 | api `/api/v1/search` 매퍼(권한 컨텍스트) | 상 | 설계필요 | 부분(권고) |
|
||||
| 25 | 메인페이지 | 보고서 현황 카드 텍스트 잘림 | front `MyReportsPortlet.jsp`/CSS | 하 | 검토제안 | 부분(권고) |
|
||||
|
||||
### SR#5 세부 분해 (SR 관리 업무 프로세스 명확화)
|
||||
|
||||
프로세스: **등록 → 접수 → 처리 → PM확인 → KIC담당자 최종확인**, 반려 시 이전 단계 복귀.
|
||||
|
||||
| 하위 | 내용 | 판정 | 상태 |
|
||||
|------|------|------|------|
|
||||
| 5-a | 접수 시 결재라인에 **처리자(조치예정자)** 포함(현재 미포함 → 승인 후에도 처리 가능) | 설계필요 (결재 시맨틱 변경) | 보류(설계) |
|
||||
| 5-b | 반려 시 이전 단계 복귀(PM반려→처리, KIC반려→PM확인) | DB의존 (`PROC_REJECT` 등 스토어드프로시저가 저장소 밖) | 보류(DB) |
|
||||
| 5-c1 | 등록 메일: 발신 등록자 / 수신 PM / 제목 `[ITSM] SR(제목) 등록` | DB의존 (템플릿 `SM_003`) + 라우팅 | 부분 |
|
||||
| 5-c2 | 접수 메일: 발신 접수자(PM) / 수신 처리자 / `처리 요청` | DB의존·라우팅(`getIncidentMailReciever` type=1/3) | 부분 |
|
||||
| 5-c3 | 처리 메일: 발신 처리자 / 수신 PM / `처리 완료` | DB의존 (type=6) | 부분 |
|
||||
| 5-c4 | PM확인 메일: 발신 PM / 수신 KIC담당자 / `종결 요청` | DB의존 (type=4) | 부분 |
|
||||
| 5-c5 | KIC종결 메일: 발신 KIC / 수신 요청자 / `종결 알림` | DB의존 | 부분 |
|
||||
| 5-c6 | PM반려 메일: 발신 PM / 수신 처리자 / `반려` | DB의존 (type=5) | 부분 |
|
||||
| 5-c7 | KIC반려 메일: 발신 KIC / 수신 PM / `반려` | DB의존 | 부분 |
|
||||
|
||||
> **구현 메모(5):** 메일 발송 인프라는 `HtmlEmailUtil.SendAlarmInsert`가 알림큐 테이블에 적재하고 **batch 모듈**(`MailKaTalkSend*Job`)이 실제 SMTP 발송한다. 코드상 수신자 라우팅(type 1~7)은 존재하나, 각 단계 제목/본문은 DB 공통코드 템플릿 `SM_003`에 있어 **문구 확정은 DB 데이터 변경**이 필요하다. 상태전이(반려 시 복귀)는 `PROC_APPROVAL/PROC_REJECT/PROC_REQ_APPROVAL` **스토어드프로시저**에 있고 저장소에 정의가 없어 **DB에서 수정**해야 한다. 처리자 결재라인 포함(5-a)은 접수측 `approvalsList`에 조치예정자를 추가하는 설계 변경으로, 승인 시맨틱에 영향이 커 별도 승인 후 진행 권고. 코드로 처리한 것: 등록 커밋 이후 메일 발송 실패가 사용자 오류화면으로 노출되던 문제(→ SR#12 try/catch).
|
||||
|
||||
---
|
||||
|
||||
## B. 기능개선 11 + 장애처리 4 (pptx) + F12(브랜딩)
|
||||
|
||||
| # | 구분 | 요약 | 대상 | 판정 | 상태 | 중복매핑 |
|
||||
|---|------|------|------|------|------|----------|
|
||||
| F01 | 기능개선 | 보고서 양식명 전체(요약) 표시 | front `ReportList.jsp` (+select 네이티브 truncation 잔존) | 검토제안 | 부분 | |
|
||||
| F02 | 기능개선 | 다수 문서 선택 후 프린트·승인(관리자·kic_it) | front `ReportCheckList.jsp` 신규 체크박스+배치호출 | 설계필요 | 보류 | |
|
||||
| F03 | 기능개선 | 서비스신청 시 서비스 항목 선택 제거→SR기본요청양식 고정 | front `SvcDeskReqInsert.jsp` | 즉시구현 | 완료 | SR#6 연관 |
|
||||
| F04 | 기능개선 | 권한그룹관리 가입상태 표시 + 삭제상태면 등록여부 자동 N | api `AuthorGroupMapper.xml` union에 가입상태 컬럼 추가 | 설계필요·DB검증 | 보류 | |
|
||||
| F05 | 기능개선 | 업무사용자관리 그룹아이디 기본값 KIC | front `UserSelectUpdt.jsp` | 즉시구현 | 완료 | |
|
||||
| F06 | 기능개선 | 게시판 제목 클릭 진입 | front `ReportCheckList.jsp`(제목 링크) | 즉시구현 | 완료 | |
|
||||
| F07 | 기능개선 | 사용자관리 메뉴명 통일 + 불필요 기능 제거 | DB `TB_MENU_INFO` 메뉴명 | DB의존 | 보류 | |
|
||||
| F08 | 기능개선 | 권한명별 포틀릿(엔지니어·빈권한은 자산현황·보고서 처리현황 비노출) | api 포틀릿 신규 role 차원 | 설계필요 | 보류 | |
|
||||
| F09 | 기능개선 | 관리자 게시물·댓글 삭제 권한 | front `NoticeInqire.jsp` + `BBSAdminManageController` | 즉시구현 | 완료 | |
|
||||
| F10 | 기능개선 | 게시판 목록 조회수·댓글수 표기 | api `BBSAdminManageMapper.xml` + front `NoticeList.jsp` | 즉시구현 | 완료 | |
|
||||
| F11 | 기능개선 | 그룹웨어 자동 로그인 JWT(Token) 방식 | 그룹웨어→ITMS SSO(기존 `ssoDirectlogin.do` 계약 확장) | 설계필요 | 부분(파라미터 보류) | SR#22 연관 |
|
||||
| F12 | 브랜딩(소유자지시) | 로고·파비콘 업로드/교체 관리(KIC) | front `BrandingController`·`brandingManage.jsp`·`SecurityConfig`·레이아웃/헤더/로그인 JSP | 중 | 즉시구현 | 완료 |
|
||||
| D01 | 장애처리 | 게시판 뒤로가기 '양식 다시 제출' 오류 | front `NoticeList/NoticeInqire`(POST→GET/PRG) | 설계필요 | 보류(권고) | |
|
||||
| D02 | 장애처리 | 조회조건 유지(목록 복귀 시 검색조건 초기화) | front `ReportCheckUpdate/CopyInsert.jsp` 반환경로 | 검토제안 | 부분(권고) | |
|
||||
| D03 | 장애처리 | 비밀번호 오류 vs 5회 잠금 구분 + 사번형 ID(2220105) 초기화 결함 | front `basefront/MainController` + api 초기화 흐름 | 즉시구현 | 완료 | **SR#1~3 통합** |
|
||||
| D04 | 장애처리 | 검색 후 페이지네이션 시 검색조건 소실 | front `AuthorGroupManage.jsp`(pagination jsFunction) | 즉시구현 | 완료 | |
|
||||
|
||||
> **F11(JWT SSO) 메모:** 그룹웨어 측 발급 JWT 계약(키/클레임/발급경로)이 미확보 상태. ITMS측 수용 훅은 기존 `/main/ssoDirectlogin.do`(SecurityConfig permitAll)가 존재하므로 이를 JWT 수용 엔드포인트로 확장하는 설계로 정리하고, **연동 파라미터(서명키·iss·클레임 매핑)는 보류**로 기록한다. 실구현은 그룹웨어 계약 확보 후.
|
||||
|
||||
---
|
||||
|
||||
## 요약
|
||||
- 즉시구현/완료: SR 1·2·3·7·8·9·10·12·13·14·16·19·20 + F03·F05·F06·F09·F10·F12 + D03·D04 (+ F01 부분)
|
||||
- 설계필요·DB의존·검토(부분/보류): SR 4·5·6·11·15·17·18·21·22·23·24·25 + F02·F04·F07·F08·F11 + D01·D02
|
||||
@ -1,416 +0,0 @@
|
||||
# ITMS SR 소스 변경 상세 (변경 전 → 변경 후) — 2026-07-19
|
||||
|
||||
> 리뷰·감사 추적용. 자격증명·AES 암호문·프로파일 yml·키파일은 변경 대상 아님(미기재). 빌드: `:api:compileJava :front:compileJava` BUILD SUCCESSFUL.
|
||||
|
||||
---
|
||||
|
||||
## SR#1 잠긴 계정 비밀번호 초기화 차단 + 메일 미발송 결함
|
||||
|
||||
### `api/src/main/java/com/urpsys/itmsapi/sys/controller/UserManageController.java` (관리자 초기화)
|
||||
변경 전:
|
||||
```java
|
||||
LinkedHashMap<String, Object> userInfoMap = userManageService.selectUser(requestMap);
|
||||
|
||||
if(CommonUtil.nvl(userInfoMap.get("emailAdres")).equals(""))
|
||||
{
|
||||
resBody.put("resultCd" , "-1" );
|
||||
resBody.put("resultMsg", "E-mail 이 존재하지 않습니다." );
|
||||
return ResultData.ok(resBody);
|
||||
}
|
||||
```
|
||||
변경 후:
|
||||
```java
|
||||
LinkedHashMap<String, Object> userInfoMap = userManageService.selectUser(requestMap);
|
||||
|
||||
// SR#1 : 계정이 잠겨 있으면 초기화 차단 (잠금 해제 후 가능)
|
||||
if(CommonUtil.nvl(userInfoMap.get("lockAt")).equals("Y"))
|
||||
{
|
||||
resBody.put("resultCd" , "-2" );
|
||||
resBody.put("resultMsg", "계정이 잠겨 있습니다. [로그인인증제한해제]로 잠금을 먼저 해제한 후 비밀번호를 초기화하세요." );
|
||||
return ResultData.ok(resBody);
|
||||
}
|
||||
|
||||
if(CommonUtil.nvl(userInfoMap.get("emailAdres")).equals(""))
|
||||
{ ... 동일 ... }
|
||||
```
|
||||
|
||||
### `api/src/main/java/com/urpsys/baseapi/main/controller/MainController.java` (로그인화면 초기화)
|
||||
변경 전:
|
||||
```java
|
||||
else if(!CommonUtil.nvl(userInfoMap.get("emailAdres")).equals(requestMap.get("userEmail")))
|
||||
{
|
||||
resBody.put("resultCd" , -6 );
|
||||
resBody.put("resultMsg", "사용자정보가 일치하지 않습니다." );
|
||||
return ResultData.ok(resBody);
|
||||
}
|
||||
|
||||
String strResetPassword = CommonUtil.getRandomChar(10);
|
||||
```
|
||||
변경 후:
|
||||
```java
|
||||
else if(!CommonUtil.nvl(userInfoMap.get("emailAdres")).equals(requestMap.get("userEmail")))
|
||||
{ ... 동일 ... }
|
||||
// SR#1 : 계정 잠금 시 초기화 차단 + 안내
|
||||
else if(CommonUtil.nvl(userInfoMap.get("lockAt")).equals("Y"))
|
||||
{
|
||||
resBody.put("resultCd" , -7 );
|
||||
resBody.put("resultMsg", "로그인 시도 횟수 초과로 계정이 잠겼습니다. " + getAdminDisplay() + "에게 문의 바랍니다." );
|
||||
return ResultData.ok(resBody);
|
||||
}
|
||||
|
||||
String strResetPassword = CommonUtil.getRandomChar(10);
|
||||
```
|
||||
|
||||
### `front/.../webapp/WEB-INF/jsp/main/PopPasswordReset.jsp` (서버 안내 메시지 노출)
|
||||
변경 전:
|
||||
```javascript
|
||||
else
|
||||
{
|
||||
alert("비밀번호 초기화에 실패하였습니다. \n사용자정보을 확인해주시길 바랍니다.");
|
||||
}
|
||||
```
|
||||
변경 후:
|
||||
```javascript
|
||||
else
|
||||
{
|
||||
if(data.resultMsg != null && data.resultMsg != "") { alert(data.resultMsg); }
|
||||
else { alert("비밀번호 초기화에 실패하였습니다. \n사용자정보을 확인해주시길 바랍니다."); }
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## SR#2, SR#3, D03 로그인 메시지(잠금/오입력 구분 + 관리자 성명 동적)
|
||||
|
||||
### `front/src/main/java/com/urpsys/basefront/controller/MainController.java`
|
||||
변경 전:
|
||||
```java
|
||||
if(srError[0].equals("-1")) { strErrorMsg = "고객님의 아이디는 5회 로그인 오류로 인해 잠금처리 되었습니다. 시스템 관리자에게 연락해 주세요."; }
|
||||
else if(srError[0].equals("-2")) { strErrorMsg = "아이디 혹은 비밀번호을 확인해주세요. 5회 로그인 오류인경우 아이디가 잠금처리가 됩니다."; }
|
||||
else if(srError[0].equals("-3")) { strErrorMsg = "아이디 혹은 비밀번호을 확인해주세요. 5회 로그인 오류인경우 아이디가 잠금처리가 됩니다."; }
|
||||
```
|
||||
변경 후:
|
||||
```java
|
||||
if(srError[0].equals("-1")) { strErrorMsg = "로그인 시도 횟수 초과로 계정이 잠겼습니다. " + getAdminDisplay() + "에게 문의 바랍니다."; }
|
||||
else if(srError[0].equals("-2")) { strErrorMsg = "아이디 또는 패스워드가 잘못 되었습니다. 아이디와 패스워드를 정확히 입력해 주세요."; }
|
||||
else if(srError[0].equals("-3")) { strErrorMsg = "아이디 또는 패스워드가 잘못 되었습니다. 아이디와 패스워드를 정확히 입력해 주세요."; }
|
||||
```
|
||||
추가(동적 관리자 표기 — 프로파일 yml `custom.adminName`/`custom.adminTitle` 미설정 시 "시스템 관리자"):
|
||||
```java
|
||||
@Value("${custom.adminName:}") private String strAdminName;
|
||||
@Value("${custom.adminTitle:}") private String strAdminTitle;
|
||||
private String getAdminDisplay() {
|
||||
String n = (strAdminName==null)?"":strAdminName.trim();
|
||||
String t = (strAdminTitle==null)?"":strAdminTitle.trim();
|
||||
if(n.equals("")) return "시스템 관리자";
|
||||
return "시스템 관리자(" + n + (t.equals("")?"":" "+t) + ")";
|
||||
}
|
||||
```
|
||||
(api `baseapi/main/MainController`에도 동일 `getAdminDisplay()`/`@Value` 추가 — SR#1 잠금 메시지용)
|
||||
|
||||
---
|
||||
|
||||
## SR#7, SR#10 "등록" 버튼 → "임시저장"
|
||||
|
||||
### `front/.../jsp/itms/srm/{SvcDeskInsert,SvcDeskCopyInsert,ReportCheckInsert,ReportCheckCopyInsert,ReportIssueInsert,ReportIssueCopyInsert,ReportErrorInsert,ReportErrorCopyInsert,ReportOtherInsert,ReportOtherCopyInsert}.jsp` (10파일)
|
||||
변경 전(각 파일 등록/승인요청 옆의 단독 등록 버튼):
|
||||
```jsp
|
||||
<button type="button" class="btn-etc" title="<spring:message code="button.create" />" onclick="fncXxxInsert(); return false;">
|
||||
<spring:message code="button.create" />
|
||||
</button>
|
||||
```
|
||||
변경 후:
|
||||
```jsp
|
||||
<button type="button" class="btn-etc" title="임시저장" onclick="fncXxxInsert(); return false;">
|
||||
임시저장
|
||||
</button>
|
||||
```
|
||||
(`등록/승인요청` 버튼은 그대로 유지. 단독 신청 버튼만 있는 `SvcDeskReqInsert.jsp`는 제외.)
|
||||
|
||||
---
|
||||
|
||||
## SR#8 중복 "새로만들기" 제거
|
||||
|
||||
### `front/.../jsp/itms/srm/ReportIssueDetail.jsp`
|
||||
변경 전(승인요청 블록 + 수정/삭제 블록에 각각 새로만들기 → 2개 표출):
|
||||
```jsp
|
||||
<c:if test="${(privType eq 'mine' && report.inReportStatus ne 3) || privType eq 'super'}">
|
||||
<!-- 새로만들기 기능 추가 -->
|
||||
<button type="button" class="btn-etc" title="새로만들기" onclick="fncReportIssueCopyInsert(); return false;">새로만들기</button>
|
||||
<button type="button" class="btn-etc" title="수정" onclick="fncReportIssueUpdate(); return false;">
|
||||
```
|
||||
변경 후(수정/삭제 블록의 중복 새로만들기 제거):
|
||||
```jsp
|
||||
<c:if test="${(privType eq 'mine' && report.inReportStatus ne 3) || privType eq 'super'}">
|
||||
<!-- SR#8 중복 '새로만들기' 제거 (상단 승인요청 블록의 새로만들기로 일원화) -->
|
||||
<button type="button" class="btn-etc" title="수정" onclick="fncReportIssueUpdate(); return false;">
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## SR#9 조치예정자 직접선택 차단(신청) + 접수자/접수일시 서버제어(접수)
|
||||
|
||||
### `front/.../jsp/itms/srm/SvcDeskReqInsert.jsp` (조치예정자 돋보기 제거)
|
||||
변경 전:
|
||||
```jsp
|
||||
<input type="text" name="vcChargeUser" id="vcChargeUser" style="width: 90%;" readonly value=""/>
|
||||
<a href="<c:url value='/cmm/selectUserListPopup.do' />" ... onclick="fn_User_Search('조치예정', 'inChargeUser', '', 'vcChargeUser', '', '');return false;">
|
||||
<img src="...btn_search.gif" alt="조치예정자 검색" title="조치예정자 검색"></a>
|
||||
<input type="hidden" name="inChargeUser" id="inChargeUser" value="" >
|
||||
```
|
||||
변경 후:
|
||||
```jsp
|
||||
<!-- SR#9-1 : 서비스 선택에 따라 자동배정, 돋보기 제거 -->
|
||||
<input type="text" name="vcChargeUser" id="vcChargeUser" style="width: 60%;" readonly value=""/>
|
||||
<span style="color:#888;">(자동배정)</span>
|
||||
<input type="hidden" name="inChargeUser" id="inChargeUser" value="" >
|
||||
```
|
||||
|
||||
### `api/.../itmsapi/srm/controller/SvcDeskController.java` (접수자/접수일시 서버 강제)
|
||||
변경 전: (클라이언트가 보낸 incidentVo 값을 그대로 서비스로 전달)
|
||||
```java
|
||||
LinkedHashMap<String, Object> returnMap = svcDeskService.addIncident(incidentVoMap, approvalsList, fileList, reqApprovalMap);
|
||||
```
|
||||
변경 후:
|
||||
```java
|
||||
// SR#9-2,9-3 : 접수자/접수일시 서버 권한값 강제
|
||||
TokenInfo tokenInfoReg = CommonUtil.getAccessTokenInfo(request);
|
||||
incidentVoMap.put("inRegUser" , tokenInfoReg.getUniqId());
|
||||
incidentVoMap.put("vcRegUser" , tokenInfoReg.getUserName());
|
||||
incidentVoMap.put("dtReceiptDatetime", CommonUtil.getKST("yyyy-MM-dd HH:mm"));
|
||||
|
||||
LinkedHashMap<String, Object> returnMap = svcDeskService.addIncident(incidentVoMap, approvalsList, fileList, reqApprovalMap);
|
||||
```
|
||||
(완료요청일시는 사용자 입력 성격상 유지)
|
||||
|
||||
---
|
||||
|
||||
## SR#12 입력값 길이 검증 + 이중 결함(장애페이지 후 등록) 차단
|
||||
|
||||
### `api/.../itmsapi/srm/controller/SvcDeskController.java` 및 `SvcDeskReqController.java` (등록 전 길이검증)
|
||||
변경 전: 검증 없이 바로 등록 호출.
|
||||
변경 후(양 컨트롤러 공통):
|
||||
```java
|
||||
String strTitle = CommonUtil.nvl(incidentVoMap.get("vcIncidentTitle"));
|
||||
String strBody = CommonUtil.nvl(incidentVoMap.get("txIncidentBody"));
|
||||
if(strTitle.length() > 200) { resBody.put("resultCd","-2"); resBody.put("resultMsg","제목은 200자 이내로 입력해 주세요. (현재 "+strTitle.length()+"자)"); return ResultData.ok(resBody); }
|
||||
if(strBody.length() > 60000){ resBody.put("resultCd","-2"); resBody.put("resultMsg","본문 내용이 너무 깁니다. 60,000자 이내로 입력해 주세요."); return ResultData.ok(resBody); }
|
||||
```
|
||||
|
||||
### `front/.../itmsfront/srm/controller/SvcDeskController.java` (커밋 후 메일 예외 격리)
|
||||
변경 전:
|
||||
```java
|
||||
if(returnMap.get("resultCd").equals("0")) { commonService.sendIncidentMail(1, (int)returnMap.get("inIncidentSeq")); }
|
||||
if(strReqApprovalYn.equals("Y") && returnMap.get("resultCd").equals("0")) { commonService.sendIncidentMail(3, (int)returnMap.get("inIncidentSeq")); }
|
||||
```
|
||||
변경 후:
|
||||
```java
|
||||
try {
|
||||
if(returnMap.get("resultCd").equals("0")) { commonService.sendIncidentMail(1, (int)returnMap.get("inIncidentSeq")); }
|
||||
if(strReqApprovalYn.equals("Y") && returnMap.get("resultCd").equals("0")) { commonService.sendIncidentMail(3, (int)returnMap.get("inIncidentSeq")); }
|
||||
} catch(Exception mailEx) {
|
||||
log.error("서비스 등록 후 메일발송 실패(등록은 정상): {}", mailEx.getMessage()); // 등록 결과에 영향 없음
|
||||
}
|
||||
```
|
||||
|
||||
### `front/.../jsp/itms/srm/{SvcDeskInsert,SvcDeskReqInsert}.jsp` (검증 메시지 노출 + maxlength)
|
||||
변경 전:
|
||||
```javascript
|
||||
success: function(data) { alert("등록 완료 되었습니다."); fncSvcDeskList(); }
|
||||
```
|
||||
변경 후:
|
||||
```javascript
|
||||
success: function(data) {
|
||||
if(data.resultCd != "0") { alert(data.resultMsg); return; } // SR#12 검증 실패 안내
|
||||
alert("등록 완료 되었습니다."); fncSvcDeskList();
|
||||
}
|
||||
```
|
||||
그리고 제목 input에 `maxlength="200"` 추가.
|
||||
|
||||
---
|
||||
|
||||
## SR#13 에디터 높이 무한 증가 → 최대높이
|
||||
|
||||
### `front/src/main/resources/static/js/tinymce_uritms_setting.js` (drawEditorWrite/drawEditorRead 2곳)
|
||||
변경 전:
|
||||
```javascript
|
||||
height: 300,
|
||||
min_height: 300, // 최소 높이
|
||||
toolbar_mode: 'floating',
|
||||
```
|
||||
변경 후:
|
||||
```javascript
|
||||
height: 300,
|
||||
min_height: 300, // 최소 높이
|
||||
max_height: 600, // SR#13 최대 높이 제한(초과 시 내부 스크롤)
|
||||
toolbar_mode: 'floating',
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## SR#14 신청번호 부분검색 + SR#16 본인 신청건만 조회
|
||||
|
||||
### `api/.../mapper/.../itms/srm/SvcDeskReqMapper.xml`
|
||||
변경 전:
|
||||
```xml
|
||||
<sql id="searchFilter">
|
||||
<if test="incidentReqNum != null and incidentReqNum != ''"> AND A.VC_REQ_INCIDENT_NUM = #{incidentReqNum} </if>
|
||||
...
|
||||
</sql>
|
||||
```
|
||||
변경 후:
|
||||
```xml
|
||||
<sql id="searchFilter">
|
||||
<!-- SR#14 부분검색 + 바인딩 -->
|
||||
<if test="incidentReqNum != null and incidentReqNum != ''"> AND A.VC_REQ_INCIDENT_NUM LIKE CONCAT('%', #{incidentReqNum}, '%') </if>
|
||||
...
|
||||
<!-- SR#16 일반 사용자 본인 신청건만 -->
|
||||
<if test="reqUserFilter != null and reqUserFilter != ''"> AND A.IN_REQ_USER = #{reqUserFilter} </if>
|
||||
</sql>
|
||||
```
|
||||
|
||||
### `api/.../itmsapi/srm/controller/SvcDeskReqController.java` (비관리자 필터 주입)
|
||||
변경 후 추가:
|
||||
```java
|
||||
String strRoleReq = CommonUtil.nvl(tokenInfo.getAuthorities());
|
||||
if(strRoleReq.indexOf("ROLE_ADMIN") < 0) { requestMap.put("reqUserFilter", tokenInfo.getUniqId()); }
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## SR#19 오타 "없무권한" → "업무권한"
|
||||
|
||||
### `front/.../jsp/itms/error/errorNoAuth.jsp`
|
||||
변경 전: `시스템 관리자에게 없무권한 부여후 사용하시길 바랍니다.`
|
||||
변경 후: `시스템 관리자에게 업무권한 부여후 사용하시길 바랍니다.`
|
||||
|
||||
---
|
||||
|
||||
## SR#20 "인스턴트"(인스던트/인시던트) → "서비스"
|
||||
|
||||
front 모듈 전체 스윕 — JSP/JS/Java/XML 48파일 172건. 예:
|
||||
- 변경 전: `<title> 인스던트 신청 </title>` / `confirm("인스던트 신청 처리를 하시겠습니까?")` / `<th> 인스던트 접수번호 </th>`
|
||||
- 변경 후: `<title> 서비스 신청 </title>` / `confirm("서비스 신청 처리를 하시겠습니까?")` / `<th> 서비스 접수번호 </th>`
|
||||
(명령: `sed 's/인스던트/서비스/g'`, `sed 's/인시던트/서비스/g'` — "인스턴스"(instance)는 미변경)
|
||||
|
||||
---
|
||||
|
||||
## SR#23 FOOTER 저작권 오타
|
||||
|
||||
### `front/.../jsp/main/inc/IncFooter.jsp`
|
||||
변경 전: `COPYRIGHT © 20242 URP. All Right Reserved`
|
||||
변경 후: `COPYRIGHT © 2024 URP. All Right Reserved`
|
||||
|
||||
---
|
||||
|
||||
## F01 보고서 양식명 전체 표시(툴팁)
|
||||
|
||||
### `front/.../jsp/itms/rem/ReportList.jsp`
|
||||
변경 전: `<td><a href="javascript:fncSelectReport('${report.inReportForm}')" style="text-align: center;" >${report.vcFormName}</a></td>`
|
||||
변경 후: `<td title="${report.vcFormName}"><a href="javascript:fncSelectReport('${report.inReportForm}')" title="${report.vcFormName}">${report.vcFormName}</a></td>`
|
||||
|
||||
---
|
||||
|
||||
## F03 서비스신청 서비스 항목 고정(SR기본요청양식)
|
||||
|
||||
### `front/.../jsp/itms/srm/SvcDeskReqInsert.jsp`
|
||||
변경 후 추가(select 아래):
|
||||
```javascript
|
||||
$(function(){
|
||||
var $s = $('#inServiceCode');
|
||||
$s.find('option').each(function(){ if($.trim($(this).text())=='SR기본요청양식'){ $s.val($(this).val()); return false; } });
|
||||
$s.css({'pointer-events':'none','background-color':'#f2f2f2'}).attr('tabindex','-1'); // 값은 제출, 변경 불가
|
||||
});
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## F05 그룹아이디 기본값 KIC
|
||||
|
||||
### `front/.../jsp/itms/sys/UserSelectUpdt.jsp`
|
||||
변경 후 추가(select 아래):
|
||||
```javascript
|
||||
$(function(){
|
||||
var $g = $('#groupId');
|
||||
if($g.length>0 && ($g.val()==null || $g.val()=='')) {
|
||||
$g.find('option').each(function(){ if($.trim($(this).text())=='KIC'){ $g.val($(this).val()); return false; } });
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## F06 게시판 제목 클릭 진입
|
||||
|
||||
### `front/.../jsp/itms/srm/ReportCheckList.jsp`
|
||||
변경 전(제목 = 일반 텍스트):
|
||||
```jsp
|
||||
<td title="${reportList.vcReportTitle}">
|
||||
<c:choose><c:when test="${fn:length(reportList.vcReportTitle) > 25}">...</c:when><c:otherwise>...</c:otherwise></c:choose>
|
||||
</td>
|
||||
```
|
||||
변경 후(제목 = 링크):
|
||||
```jsp
|
||||
<td title="${reportList.vcReportTitle}">
|
||||
<a href="javascript:fncSelectReportCheck('${reportList.inReportSeq}')">
|
||||
<c:choose>...</c:choose>
|
||||
</a>
|
||||
</td>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## F09 관리자 게시물/댓글 삭제 권한
|
||||
|
||||
### `front/.../itmsfront/bbs/controller/BBSAdminManageController.java`
|
||||
변경 후 추가: `model.addAttribute("sessionAdminYn", (role.indexOf("ROLE_ADMIN")>-1)?"Y":"N");`
|
||||
|
||||
### `front/.../jsp/itms/bbs/admin/NoticeInqire.jsp`
|
||||
변경 후: 작성자 삭제 블록 뒤에 관리자 전용 삭제 버튼 추가
|
||||
```jsp
|
||||
<c:if test="${result.frstRegisterId != sessionUniqId && sessionAdminYn == 'Y'}">
|
||||
<button ... onclick="fn_egov_delete_notice(); return false;">삭제</button>
|
||||
</c:if>
|
||||
```
|
||||
댓글 삭제 조건 변경 전: `<c:if test="${listCn.deleteYn eq 'Y' }">` → 변경 후: `<c:if test="${listCn.deleteYn eq 'Y' || sessionAdminYn == 'Y' }">`
|
||||
|
||||
---
|
||||
|
||||
## F10 게시판 조회수/댓글수 표기
|
||||
|
||||
### `api/.../mapper/.../itms/bbs/BBSAdminManageMapper.xml`
|
||||
변경 후 추가(select 컬럼):
|
||||
```xml
|
||||
, ( SELECT COUNT(1) FROM TB_CMNT_INFO cc WHERE cc.NTT_ID = a.NTT_ID AND cc.USE_AT = 'Y' ) AS cmntCnt
|
||||
```
|
||||
### `front/.../jsp/itms/bbs/admin/NoticeList.jsp`
|
||||
헤더에 `<th scope="col">댓글수</th>`, 본문에 `<td><c:out value="${result.cmntCnt}" /></td>` 추가(빈목록 colspan 7/5/4 → 8/6/5).
|
||||
|
||||
---
|
||||
|
||||
## F12 로고/파비콘 브랜딩 관리(KIC)
|
||||
|
||||
### 신규 `front/.../basefront/controller/BrandingController.java`
|
||||
- `GET /branding/logo`·`/branding/favicon` : 업로드본 우선, 없으면 번들 KIC 기본자산(webapp `/branding/default/*`) 폴백. 캐시무효화 헤더.
|
||||
- `GET /branding/brandingManageView.do` : 관리자 화면(비관리자 → 메인 리다이렉트).
|
||||
- `POST /branding/upload.do` : 관리자 검증 + 확장자 화이트리스트(logo: svg/png/jpg/gif, favicon: ico/png/svg/jpg/gif) + 2MB 제한 + 저장파일명 서버고정(`kind.ext`, 사용자 파일명 미사용→경로조작 차단) + canonical 경로 재확인.
|
||||
|
||||
### `front/.../basefront/config/SecurityConfig.java`
|
||||
변경 후 추가: `.antMatchers("/branding/logo", "/branding/favicon").permitAll()` (로그인 전 표출).
|
||||
|
||||
### 참조 변경(정적 로고/파비콘 → 동적 엔드포인트)
|
||||
- `front/.../jsp/main/LoginUsr.jsp`·`LoginUsr_kic.jsp` : `${ctx}/images/main/logo.png` → `${ctx}/branding/logo`
|
||||
- `front/.../jsp/tilesLayout/{uritms-base-main1,uritms-base-main2,uritms-base-popup1,uritms-popup1}.jsp` : `<link rel="shortcut icon" href="data:image/x-icon;,">` → `href="${pageContext.request.contextPath}/branding/favicon"`
|
||||
- `front/.../jsp/main/inc/IncHeader.jsp` : `<h1 class="logo">` 에 `background-image:url('<c:url value="/branding/logo"/>')` 인라인 지정
|
||||
|
||||
### 신규 자산·화면
|
||||
- `front/src/main/webapp/branding/default/logo.svg`·`favicon.jpg` (KIC 공식 자산 번들)
|
||||
- `front/.../jsp/branding/brandingManage.jsp` (업로드/미리보기 화면)
|
||||
|
||||
---
|
||||
|
||||
## D04 검색 후 페이지네이션 검색조건 소실
|
||||
|
||||
### `front/.../jsp/itms/sys/AuthorGroupManage.jsp`
|
||||
변경 전: `<ui:pagination paginationInfo="${paginationInfo}" type="image" jsFunction="fn_egov_select_linkPage"/>` (해당 함수 미정의 → 검색조건 유실)
|
||||
변경 후: `<ui:pagination paginationInfo="${paginationInfo}" type="image" jsFunction="linkPage"/>` (listForm 재제출 → searchCondition/searchKeyword 유지)
|
||||
@ -170,7 +170,7 @@ public class CommonService
|
||||
}
|
||||
|
||||
/**
|
||||
* 서비스 액션별 메일처리
|
||||
* 인스던트 액션별 메일처리
|
||||
* @author urp 인프라본부 나혁제
|
||||
* 작성일 : 2025.03.20
|
||||
*/
|
||||
|
||||
@ -152,25 +152,25 @@ public class RestApiCallUtil
|
||||
// Map 변환처리
|
||||
Map<String, Object> returnMap = null;
|
||||
|
||||
// 비정상처리
|
||||
// 비정상처리
|
||||
if(strFullReturnData.indexOf("status")<0)
|
||||
{
|
||||
// 2026-07-20 방어적 파싱: 필드 부재 시 예외(JSONException) 대신 안전 기본값 → 페이지 전체 붕괴 방지
|
||||
String strMessage = returnObj.optString("message", returnObj.optString("error", "요청 처리 중 오류가 발생했습니다."));
|
||||
|
||||
String strError = (String)returnObj.get("error");
|
||||
String strMessage = (String)returnObj.get("message");
|
||||
|
||||
throw new CustomException("9000", strMessage);
|
||||
}
|
||||
// 정상처리
|
||||
// 정상처리
|
||||
else
|
||||
{
|
||||
// log.info("한번 봅시다 2. => [{}]", returnObj.get("status"));
|
||||
int iReturnStatus = returnObj.optInt("status", 200);
|
||||
|
||||
int iReturnStatus = (int)returnObj.get("status");
|
||||
|
||||
if(iReturnStatus != 200)
|
||||
{
|
||||
// 2026-07-20 trace 옵셔널: 없으면 message/error 로 폴백(kong.unirest get() 은 키부재 시 예외)
|
||||
String strErrTrace = returnObj.optString("trace", returnObj.optString("message", returnObj.optString("error", "요청 처리 중 오류가 발생했습니다.")));
|
||||
|
||||
String strError = (String)returnObj.get("error");
|
||||
String strErrTrace = (String)returnObj.get("trace");
|
||||
|
||||
throw new CustomException("9000", strErrTrace);
|
||||
}
|
||||
else
|
||||
@ -223,13 +223,13 @@ public class RestApiCallUtil
|
||||
JSONObject returnObj = jsonResponse.getBody().getObject();
|
||||
JSONObject returnObjData = new JSONObject();
|
||||
|
||||
int iReturnStatus = returnObj.optInt("status", 200);
|
||||
|
||||
int iReturnStatus = (int)returnObj.get("status");
|
||||
|
||||
if(iReturnStatus != 200)
|
||||
{
|
||||
// 2026-07-20 방어적 파싱: trace 부재 시 message/error 폴백(예외→501 붕괴 방지)
|
||||
String strErrTrace = returnObj.optString("trace", returnObj.optString("message", returnObj.optString("error", "요청 처리 중 오류가 발생했습니다.")));
|
||||
|
||||
String strError = (String)returnObj.get("error");
|
||||
String strErrTrace = (String)returnObj.get("trace");
|
||||
|
||||
throw new CustomException("9000", strErrTrace);
|
||||
}
|
||||
else
|
||||
|
||||
@ -69,9 +69,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
|
||||
.antMatchers("/EgovModal.do" ).permitAll()
|
||||
.antMatchers("/main/noAuth*.do" ).permitAll()
|
||||
.antMatchers("/validator*" ).permitAll()
|
||||
.antMatchers("/main/ssoDirectlogin.do" ).permitAll() // 2026.04.02 나혁제 SSO 로그인처리
|
||||
.antMatchers("/branding/logo", "/branding/favicon").permitAll() // 2026.07.19 F12 브랜딩 로고/파비콘 공개 서빙 (로그인 페이지 표출용)
|
||||
|
||||
.antMatchers("/main/ssoDirectlogin.do" ).permitAll() // 2026.04.02 나혁제 SSO 로그인처리
|
||||
|
||||
// .antMatchers("//validator*" ).permitAll()
|
||||
// .antMatchers("/main/searchIdFind.do" ).permitAll()
|
||||
// .antMatchers("/main/UserPasswordResetExt.do" ).permitAll()
|
||||
|
||||
@ -1,227 +0,0 @@
|
||||
package com.urpsys.basefront.controller;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.nio.file.Files;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.servlet.http.HttpSession;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
|
||||
import com.urpsys.basefront.domain.TokenInfo;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
* @Class Name : BrandingController.java
|
||||
* @Description : 2026.07.19 기능개선12/F12 — 로고/파비콘 교체 관리(KIC 브랜딩)
|
||||
*
|
||||
* - 공개 서빙 : GET /branding/logo, GET /branding/favicon (로그인 페이지·헤더·favicon 참조)
|
||||
* - 관리자 화면 : GET /branding/brandingManageView.do (업로드/미리보기)
|
||||
* - 업로드 처리 : POST /branding/upload.do (관리자만, 확장자 화이트리스트·크기제한·경로조작 차단)
|
||||
*
|
||||
* DB 의존 없음. 업로드본은 파일시스템(custom.brandingDir, 미설정 시 java.io.tmpdir/itms-branding)에 저장하며
|
||||
* 재기동 없이 즉시 반영된다. 업로드본이 없으면 webapp 번들 KIC 기본자산(/branding/default/*)으로 폴백한다.
|
||||
*
|
||||
* @author URP 인프라본부
|
||||
* @since 2026.07.19
|
||||
*/
|
||||
@Slf4j
|
||||
@Controller
|
||||
public class BrandingController
|
||||
{
|
||||
// 허용 확장자(화이트리스트) — 사용자 입력 파일명은 절대 저장경로에 사용하지 않음(경로조작 차단)
|
||||
private static final List<String> ALLOW_LOGO = Arrays.asList("svg", "png", "jpg", "jpeg", "gif");
|
||||
private static final List<String> ALLOW_FAVICON = Arrays.asList("ico", "png", "svg", "jpg", "jpeg", "gif");
|
||||
private static final long MAX_SIZE = 2L * 1024 * 1024; // 2MB
|
||||
|
||||
@Value("${custom.brandingDir:}")
|
||||
private String strBrandingDir;
|
||||
|
||||
/** 업로드 저장 디렉터리(미설정 시 임시디렉터리 하위 고정 폴더) */
|
||||
private File getBrandingDir()
|
||||
{
|
||||
String dir = (strBrandingDir == null) ? "" : strBrandingDir.trim();
|
||||
if(dir.equals(""))
|
||||
{
|
||||
dir = System.getProperty("java.io.tmpdir") + File.separator + "itms-branding";
|
||||
}
|
||||
File f = new File(dir);
|
||||
if(!f.exists()) f.mkdirs();
|
||||
return f;
|
||||
}
|
||||
|
||||
private String contentType(String ext)
|
||||
{
|
||||
switch(ext)
|
||||
{
|
||||
case "svg" : return "image/svg+xml";
|
||||
case "png" : return "image/png";
|
||||
case "jpg" :
|
||||
case "jpeg": return "image/jpeg";
|
||||
case "ico" : return "image/x-icon";
|
||||
case "gif" : return "image/gif";
|
||||
default : return "application/octet-stream";
|
||||
}
|
||||
}
|
||||
|
||||
/** 업로드된 오버라이드 파일(kind.ext) 탐색 — 없으면 null */
|
||||
private File findOverride(String kind, List<String> allow)
|
||||
{
|
||||
File dir = getBrandingDir();
|
||||
for(String ext : allow)
|
||||
{
|
||||
File f = new File(dir, kind + "." + ext);
|
||||
if(f.exists() && f.isFile()) return f;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/** 확장자 추출(소문자) */
|
||||
private String extOf(String name)
|
||||
{
|
||||
if(name == null) return "";
|
||||
int p = name.lastIndexOf('.');
|
||||
return (p < 0) ? "" : name.substring(p + 1).toLowerCase();
|
||||
}
|
||||
|
||||
/** 공통 서빙 로직 : 오버라이드 → 없으면 번들 기본자산 */
|
||||
private void serve(String kind, List<String> allow, String defaultResource, String defaultExt
|
||||
, HttpServletRequest request, HttpServletResponse response) throws IOException
|
||||
{
|
||||
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
|
||||
response.setHeader("Pragma", "no-cache");
|
||||
|
||||
File override = findOverride(kind, allow);
|
||||
if(override != null)
|
||||
{
|
||||
response.setContentType(contentType(extOf(override.getName())));
|
||||
try(InputStream in = new FileInputStream(override); OutputStream out = response.getOutputStream())
|
||||
{
|
||||
copy(in, out);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// 번들 KIC 기본자산 폴백 (webapp /branding/default/*)
|
||||
response.setContentType(contentType(defaultExt));
|
||||
try(InputStream in = request.getServletContext().getResourceAsStream(defaultResource);
|
||||
OutputStream out = response.getOutputStream())
|
||||
{
|
||||
if(in != null) copy(in, out);
|
||||
}
|
||||
}
|
||||
|
||||
private void copy(InputStream in, OutputStream out) throws IOException
|
||||
{
|
||||
byte[] buf = new byte[8192];
|
||||
int n;
|
||||
while((n = in.read(buf)) != -1) out.write(buf, 0, n);
|
||||
out.flush();
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
// 공개 서빙 엔드포인트 (SecurityConfig permitAll)
|
||||
// ---------------------------------------------------------------------
|
||||
@RequestMapping(value = "/branding/logo")
|
||||
public void logo(HttpServletRequest request, HttpServletResponse response) throws IOException
|
||||
{
|
||||
serve("logo", ALLOW_LOGO, "/branding/default/logo.svg", "svg", request, response);
|
||||
}
|
||||
|
||||
@RequestMapping(value = "/branding/favicon")
|
||||
public void favicon(HttpServletRequest request, HttpServletResponse response) throws IOException
|
||||
{
|
||||
serve("favicon", ALLOW_FAVICON, "/branding/default/favicon.jpg", "jpg", request, response);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
// 관리자 화면 + 업로드 (인증 필요, 관리자 권한 검증)
|
||||
// ---------------------------------------------------------------------
|
||||
private boolean isAdmin(HttpServletRequest request)
|
||||
{
|
||||
HttpSession session = request.getSession(false);
|
||||
if(session == null) return false;
|
||||
Object obj = session.getAttribute("tokenInfo");
|
||||
if(!(obj instanceof TokenInfo)) return false;
|
||||
String auth = ((TokenInfo)obj).getAuthorities();
|
||||
return (auth != null && auth.indexOf("ROLE_ADMIN") > -1);
|
||||
}
|
||||
|
||||
@RequestMapping(value = "/branding/brandingManageView.do")
|
||||
public ModelAndView brandingManageView(HttpServletRequest request)
|
||||
{
|
||||
ModelAndView mav = new ModelAndView();
|
||||
if(!isAdmin(request))
|
||||
{
|
||||
mav.setViewName("redirect:/main/mainPage.do");
|
||||
return mav;
|
||||
}
|
||||
mav.addObject("hasLogo" , findOverride("logo" , ALLOW_LOGO) != null);
|
||||
mav.addObject("hasFavicon", findOverride("favicon", ALLOW_FAVICON) != null);
|
||||
mav.setViewName("uritms-tiles1/branding/brandingManage");
|
||||
return mav;
|
||||
}
|
||||
|
||||
@ResponseBody
|
||||
@RequestMapping(value = "/branding/upload.do")
|
||||
public String upload(@RequestParam("kind") String kind
|
||||
, @RequestParam("file") MultipartFile file
|
||||
, HttpServletRequest request) throws IOException
|
||||
{
|
||||
if(!isAdmin(request))
|
||||
{
|
||||
return "{\"resultCd\":\"-9\",\"resultMsg\":\"관리자만 변경할 수 있습니다.\"}";
|
||||
}
|
||||
if(!("logo".equals(kind) || "favicon".equals(kind)))
|
||||
{
|
||||
return "{\"resultCd\":\"-1\",\"resultMsg\":\"잘못된 요청입니다.\"}";
|
||||
}
|
||||
if(file == null || file.isEmpty())
|
||||
{
|
||||
return "{\"resultCd\":\"-2\",\"resultMsg\":\"파일을 선택해 주세요.\"}";
|
||||
}
|
||||
if(file.getSize() > MAX_SIZE)
|
||||
{
|
||||
return "{\"resultCd\":\"-3\",\"resultMsg\":\"파일 크기는 2MB 이하만 허용됩니다.\"}";
|
||||
}
|
||||
|
||||
List<String> allow = "logo".equals(kind) ? ALLOW_LOGO : ALLOW_FAVICON;
|
||||
String ext = extOf(file.getOriginalFilename());
|
||||
if(!allow.contains(ext))
|
||||
{
|
||||
return "{\"resultCd\":\"-4\",\"resultMsg\":\"허용되지 않는 형식입니다. (허용: " + allow + ")\"}";
|
||||
}
|
||||
|
||||
// 저장 파일명은 서버가 고정 생성(kind.ext) — 사용자 파일명 미사용 → 경로조작 원천 차단
|
||||
File dir = getBrandingDir();
|
||||
// 기존 동종 오버라이드 정리(확장자 변경 대비)
|
||||
File old = findOverride(kind, allow);
|
||||
if(old != null) old.delete();
|
||||
|
||||
File target = new File(dir, kind + "." + ext);
|
||||
// canonical 경로가 지정 디렉터리 하위인지 재확인(방어적)
|
||||
if(!target.getCanonicalPath().startsWith(dir.getCanonicalPath()))
|
||||
{
|
||||
return "{\"resultCd\":\"-5\",\"resultMsg\":\"잘못된 경로입니다.\"}";
|
||||
}
|
||||
|
||||
Files.copy(file.getInputStream(), target.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING);
|
||||
log.info("F12 브랜딩 업로드 완료: kind={}, ext={}, path={}", kind, ext, target.getAbsolutePath());
|
||||
|
||||
return "{\"resultCd\":\"0\",\"resultMsg\":\"정상적으로 변경되었습니다.\"}";
|
||||
}
|
||||
}
|
||||
@ -106,30 +106,8 @@ public class MainController
|
||||
private String strClient; // 납품고객
|
||||
|
||||
@Value("${custom.urlAuthCheck}")
|
||||
private String strUrlAuthCheck; // 2026.03.12 나혁제 url 보안체크 여부
|
||||
|
||||
// 2026.07.19 SR#1~3 시스템 관리자(KIC 담당자) 성명/호칭 동적 셋팅 (프로파일 yml custom.adminName/custom.adminTitle 로 설정, 미설정 시 "시스템 관리자")
|
||||
@Value("${custom.adminName:}")
|
||||
private String strAdminName; // 시스템 관리자 성명 (예: 홍길동)
|
||||
|
||||
@Value("${custom.adminTitle:}")
|
||||
private String strAdminTitle; // 시스템 관리자 호칭 (예: 과장)
|
||||
|
||||
/**
|
||||
* 시스템 관리자 표기 문자열 생성 (SR#1~3)
|
||||
* 성명 미설정: "시스템 관리자" / 성명 설정: "시스템 관리자(홍길동 과장)"
|
||||
*/
|
||||
private String getAdminDisplay()
|
||||
{
|
||||
String strName = (strAdminName == null) ? "" : strAdminName.trim();
|
||||
String strTitle = (strAdminTitle == null) ? "" : strAdminTitle.trim();
|
||||
if(strName.equals(""))
|
||||
{
|
||||
return "시스템 관리자";
|
||||
}
|
||||
return "시스템 관리자(" + strName + (strTitle.equals("") ? "" : " " + strTitle) + ")";
|
||||
}
|
||||
|
||||
private String strUrlAuthCheck; // 2026.03.12 나혁제 url 보안체크 여부
|
||||
|
||||
@RequestMapping(value={ "/", "/main/actionMain.do"})
|
||||
public String actionMain(HttpServletRequest request
|
||||
, HttpServletResponse response
|
||||
@ -171,18 +149,15 @@ public class MainController
|
||||
// 에러메세지 생성
|
||||
if(srError[0].equals("-1"))
|
||||
{
|
||||
// SR#1,2 / 장애처리03 : 계정 잠금 안내 (시스템 관리자 성명·호칭 동적)
|
||||
strErrorMsg = "로그인 시도 횟수 초과로 계정이 잠겼습니다. " + getAdminDisplay() + "에게 문의 바랍니다.";
|
||||
strErrorMsg = "고객님의 아이디는 5회 로그인 오류로 인해 잠금처리 되었습니다. 시스템 관리자에게 연락해 주세요.";
|
||||
}
|
||||
else if(srError[0].equals("-2"))
|
||||
{
|
||||
// SR#3 / 장애처리03 : 아이디 또는 패스워드 오입력 (잠금과 구분)
|
||||
strErrorMsg = "아이디 또는 패스워드가 잘못 되었습니다. 아이디와 패스워드를 정확히 입력해 주세요.";
|
||||
strErrorMsg = "아이디 혹은 비밀번호을 확인해주세요. 5회 로그인 오류인경우 아이디가 잠금처리가 됩니다.";
|
||||
}
|
||||
else if(srError[0].equals("-3"))
|
||||
{
|
||||
// SR#3 / 장애처리03 : 아이디 또는 패스워드 오입력 (잠금과 구분)
|
||||
strErrorMsg = "아이디 또는 패스워드가 잘못 되었습니다. 아이디와 패스워드를 정확히 입력해 주세요.";
|
||||
strErrorMsg = "아이디 혹은 비밀번호을 확인해주세요. 5회 로그인 오류인경우 아이디가 잠금처리가 됩니다.";
|
||||
}
|
||||
else if(srError[0].equals("-4"))
|
||||
{
|
||||
|
||||
@ -88,7 +88,7 @@ public class ArticleCommentController
|
||||
|
||||
String strMoveUrl = "";
|
||||
|
||||
// 서비스 상세화면을 이동
|
||||
// 인스던트 상세화면을 이동
|
||||
if(comment.getBbsId().equals("INCIDENT"))
|
||||
{
|
||||
strMoveUrl = "redirect:/srm/getIncidentBySeq.do?inIncidentSeq="+comment.getNttId();
|
||||
@ -131,7 +131,7 @@ public class ArticleCommentController
|
||||
|
||||
String strMoveUrl = "";
|
||||
|
||||
// 서비스 상세화면을 이동
|
||||
// 인스던트 상세화면을 이동
|
||||
if(comment.getBbsId().equals("INCIDENT"))
|
||||
{
|
||||
strMoveUrl = "redirect:/srm/getIncidentBySeq.do?inIncidentSeq="+comment.getNttId();
|
||||
|
||||
@ -469,9 +469,6 @@ public class BBSAdminManageController
|
||||
model.addAttribute("result" , returnMap.get("resultMap"));
|
||||
model.addAttribute("resultCnList" , returnMap.get("resultCnList")); // 2025.04.01 나혁제 댓글정보 추가
|
||||
model.addAttribute("sessionUniqId", memberVo.getTokenInfo().getUniqId());
|
||||
// 2026.07.19 기능개선09/F09 : 관리자 게시물/댓글 삭제 권한 플래그
|
||||
String strBbsRole = memberVo.getTokenInfo().getAuthorities();
|
||||
model.addAttribute("sessionAdminYn", (strBbsRole != null && strBbsRole.indexOf("ROLE_ADMIN") > -1) ? "Y" : "N");
|
||||
|
||||
//----------------------------
|
||||
// template 처리 (기본 BBS template 지정 포함)
|
||||
|
||||
@ -189,7 +189,7 @@ public class ReportCheckController
|
||||
|
||||
// RestApi Call End ---------------------------------
|
||||
|
||||
// 서비스 본문 복호화처리
|
||||
// 인스던트 본문 복호화처리
|
||||
String strReportBody = (String)resultReportCheck.get("txReportBody");
|
||||
String strReportBodyDec = CommonUtil.base64decode(strReportBody);
|
||||
|
||||
@ -257,7 +257,7 @@ public class ReportCheckController
|
||||
|
||||
// RestApi Call End ---------------------------------
|
||||
|
||||
// 서비스 본문 복호화처리
|
||||
// 인스던트 본문 복호화처리
|
||||
String strReportBody = (String)resultReportCheck.get("txReportBody");
|
||||
String strReportBodyDec = CommonUtil.base64decode(strReportBody);
|
||||
|
||||
@ -307,16 +307,16 @@ public class ReportCheckController
|
||||
List<Map<String, Object>> resultService = (List<Map<String, Object>>)returnMap.get("resultService");
|
||||
List<Map<String, Object>> resultForm = (List<Map<String, Object>>)returnMap.get("resultForm");
|
||||
Map<String, Object> resultTaskMap = (Map<String, Object>)returnMap.get("resultTask");
|
||||
Map<String, Object> resultIncident = (Map<String, Object>)returnMap.get("resultIncident"); // 서비스 정보 확인
|
||||
Map<String, Object> resultIncident = (Map<String, Object>)returnMap.get("resultIncident"); // 인스던트 정보 확인
|
||||
Map<String, Object> resultAsset = (Map<String, Object>)returnMap.get("resultAsset"); // 2025.08.20 나혁제 자산정보추가
|
||||
|
||||
model.addAttribute("resultService" , resultService ); // 서비스 정보
|
||||
model.addAttribute("resultTaskMap" , resultTaskMap ); // 작업정보
|
||||
model.addAttribute("resultIncident" , resultIncident ); // 서비스 정보
|
||||
model.addAttribute("resultIncident" , resultIncident ); // 인스던트 정보
|
||||
model.addAttribute("resultForm" , resultForm ); // 보고서 양식 정보
|
||||
model.addAttribute("resultAsset" , resultAsset ); // 보고서 양식 정보
|
||||
|
||||
// 서비스 정보가 없는경우 0 으로 세팅
|
||||
// 인스던트 정보가 없는경우 0 으로 세팅
|
||||
if(resultIncident.get("inIncidentSeq") == null)
|
||||
{
|
||||
model.addAttribute("inIncidentSeq", 0 );
|
||||
|
||||
@ -180,7 +180,7 @@ public class ReportErrorController
|
||||
|
||||
// RestApi Call End ---------------------------------
|
||||
|
||||
// 서비스 본문 복호화처리
|
||||
// 인스던트 본문 복호화처리
|
||||
String strReportBody = (String)resultReportError.get("txReportBody");
|
||||
String strReportBodyDec = CommonUtil.base64decode(strReportBody);
|
||||
|
||||
@ -247,7 +247,7 @@ public class ReportErrorController
|
||||
|
||||
// RestApi Call End ---------------------------------
|
||||
|
||||
// 서비스 본문 복호화처리
|
||||
// 인스던트 본문 복호화처리
|
||||
String strReportBody = (String)resultReportError.get("txReportBody");
|
||||
String strReportBodyDec = CommonUtil.base64decode(strReportBody);
|
||||
|
||||
@ -294,14 +294,14 @@ public class ReportErrorController
|
||||
List<Map<String, Object>> resultService = (List<Map<String, Object>>)returnMap.get("resultService");
|
||||
List<Map<String, Object>> resultForm = (List<Map<String, Object>>)returnMap.get("resultForm");
|
||||
Map<String, Object> resultTaskMap = (Map<String, Object>)returnMap.get("resultTask");
|
||||
Map<String, Object> resultIncident = (Map<String, Object>)returnMap.get("resultIncident"); // 서비스 정보 확인
|
||||
Map<String, Object> resultIncident = (Map<String, Object>)returnMap.get("resultIncident"); // 인스던트 정보 확인
|
||||
|
||||
model.addAttribute("resultService" , resultService ); // 서비스 정보
|
||||
model.addAttribute("resultTaskMap" , resultTaskMap ); // 작업정보
|
||||
model.addAttribute("resultIncident" , resultIncident ); // 서비스 정보
|
||||
model.addAttribute("resultIncident" , resultIncident ); // 인스던트 정보
|
||||
model.addAttribute("resultForm" , resultForm ); // 보고서 양식 정보
|
||||
|
||||
// 서비스 정보가 없는경우 0 으로 세팅
|
||||
// 인스던트 정보가 없는경우 0 으로 세팅
|
||||
if(resultIncident.get("inIncidentSeq") == null)
|
||||
{
|
||||
model.addAttribute("inIncidentSeq", 0 );
|
||||
|
||||
@ -180,7 +180,7 @@ public class ReportIssueController
|
||||
|
||||
// RestApi Call End ---------------------------------
|
||||
|
||||
// 서비스 본문 복호화처리
|
||||
// 인스던트 본문 복호화처리
|
||||
String strReportBody = (String)resultReportIssue.get("txReportBody");
|
||||
String strReportBodyDec = CommonUtil.base64decode(strReportBody);
|
||||
|
||||
@ -247,7 +247,7 @@ public class ReportIssueController
|
||||
|
||||
// RestApi Call End ---------------------------------
|
||||
|
||||
// 서비스 본문 복호화처리
|
||||
// 인스던트 본문 복호화처리
|
||||
String strReportBody = (String)resultReportIssue.get("txReportBody");
|
||||
String strReportBodyDec = CommonUtil.base64decode(strReportBody);
|
||||
|
||||
@ -295,14 +295,14 @@ public class ReportIssueController
|
||||
List<Map<String, Object>> resultService = (List<Map<String, Object>>)returnMap.get("resultService");
|
||||
List<Map<String, Object>> resultForm = (List<Map<String, Object>>)returnMap.get("resultForm");
|
||||
Map<String, Object> resultTaskMap = (Map<String, Object>)returnMap.get("resultTask");
|
||||
Map<String, Object> resultIncident = (Map<String, Object>)returnMap.get("resultIncident"); // 서비스 정보 확인
|
||||
Map<String, Object> resultIncident = (Map<String, Object>)returnMap.get("resultIncident"); // 인스던트 정보 확인
|
||||
|
||||
model.addAttribute("resultService" , resultService ); // 서비스 정보
|
||||
model.addAttribute("resultTaskMap" , resultTaskMap ); // 작업정보
|
||||
model.addAttribute("resultIncident" , resultIncident ); // 서비스 정보
|
||||
model.addAttribute("resultIncident" , resultIncident ); // 인스던트 정보
|
||||
model.addAttribute("resultForm" , resultForm ); // 보고서 양식 정보
|
||||
|
||||
// 서비스 정보가 없는경우 0 으로 세팅
|
||||
// 인스던트 정보가 없는경우 0 으로 세팅
|
||||
if(resultIncident.get("inIncidentSeq") == null)
|
||||
{
|
||||
model.addAttribute("inIncidentSeq", 0 );
|
||||
|
||||
@ -181,7 +181,7 @@ public class ReportOtherController
|
||||
|
||||
// RestApi Call End ---------------------------------
|
||||
|
||||
// 서비스 본문 복호화처리
|
||||
// 인스던트 본문 복호화처리
|
||||
String strReportBody = (String)resultReportOther.get("txReportBody");
|
||||
String strReportBodyDec = CommonUtil.base64decode(strReportBody);
|
||||
|
||||
@ -247,7 +247,7 @@ public class ReportOtherController
|
||||
|
||||
// RestApi Call End ---------------------------------
|
||||
|
||||
// 서비스 본문 복호화처리
|
||||
// 인스던트 본문 복호화처리
|
||||
String strReportBody = (String)resultReportOther.get("txReportBody");
|
||||
String strReportBodyDec = CommonUtil.base64decode(strReportBody);
|
||||
|
||||
@ -298,14 +298,14 @@ public class ReportOtherController
|
||||
List<Map<String, Object>> resultService = (List<Map<String, Object>>)returnMap.get("resultService");
|
||||
List<Map<String, Object>> resultForm = (List<Map<String, Object>>)returnMap.get("resultForm");
|
||||
Map<String, Object> resultTaskMap = (Map<String, Object>)returnMap.get("resultTask");
|
||||
Map<String, Object> resultIncident = (Map<String, Object>)returnMap.get("resultIncident"); // 서비스 정보 확인
|
||||
Map<String, Object> resultIncident = (Map<String, Object>)returnMap.get("resultIncident"); // 인스던트 정보 확인
|
||||
|
||||
model.addAttribute("resultService" , resultService ); // 서비스 정보
|
||||
model.addAttribute("resultTaskMap" , resultTaskMap ); // 작업정보
|
||||
model.addAttribute("resultIncident" , resultIncident ); // 서비스 정보
|
||||
model.addAttribute("resultIncident" , resultIncident ); // 인스던트 정보
|
||||
model.addAttribute("resultForm" , resultForm ); // 보고서 양식 정보
|
||||
|
||||
// 서비스 정보가 없는경우 0 으로 세팅
|
||||
// 인스던트 정보가 없는경우 0 으로 세팅
|
||||
if(resultIncident.get("inIncidentSeq") == null)
|
||||
{
|
||||
model.addAttribute("inIncidentSeq", 0 );
|
||||
|
||||
@ -77,7 +77,7 @@ public class SvcDeskController
|
||||
CommonService commonService;
|
||||
|
||||
/**
|
||||
* 서비스 데스크 서비스 목록을 조회한다.
|
||||
* 서비스 데스크 인스던트 목록을 조회한다.
|
||||
* @author urp 인프라본부 나혁제
|
||||
* 작성일 : 2025.02.08
|
||||
*/
|
||||
@ -138,7 +138,7 @@ public class SvcDeskController
|
||||
}
|
||||
|
||||
/**
|
||||
* 서비스 데스크 서비스 상세조회 화면으로 이동한다.
|
||||
* 서비스 데스크 인스던트 상세조회 화면으로 이동한다.
|
||||
* @author urp 인프라본부 나혁제
|
||||
* 작성일 : 2025.02.13
|
||||
*/
|
||||
@ -187,7 +187,7 @@ public class SvcDeskController
|
||||
|
||||
// RestApi Call End ---------------------------------
|
||||
|
||||
// 서비스 본문 복호화처리
|
||||
// 인스던트 본문 복호화처리
|
||||
String strIncidentBody = (String)resultIncident.get("txIncidentBody");
|
||||
String strIncidentBodyDec = CommonUtil.base64decode(strIncidentBody);
|
||||
|
||||
@ -215,7 +215,7 @@ public class SvcDeskController
|
||||
}
|
||||
|
||||
/**
|
||||
* 서비스 데스크 서비스 인쇄 화면 오픈
|
||||
* 서비스 데스크 인스던트 인쇄 화면 오픈
|
||||
* @author urp 인프라본부 나혁제
|
||||
* 작성일 : 2025.02.15
|
||||
*/
|
||||
@ -261,7 +261,7 @@ public class SvcDeskController
|
||||
|
||||
// RestApi Call End ---------------------------------
|
||||
|
||||
// 서비스 본문 복호화처리
|
||||
// 인스던트 본문 복호화처리
|
||||
String strIncidentBody = (String)resultIncident.get("txIncidentBody");
|
||||
String strIncidentBodyDec = CommonUtil.base64decode(strIncidentBody);
|
||||
|
||||
@ -286,7 +286,7 @@ public class SvcDeskController
|
||||
|
||||
|
||||
/**
|
||||
* 서비스 데스크 서비스 등록 화면으로 이동한다.
|
||||
* 서비스 데스크 인스던트 등록 화면으로 이동한다.
|
||||
* @author urp 인프라본부 나혁제
|
||||
* 작성일 : 2025.02.13
|
||||
*/
|
||||
@ -338,7 +338,7 @@ public class SvcDeskController
|
||||
// 서비스코드
|
||||
String strInServiceCode = CommonUtil.nvl(resultReqIncident.get("inServiceCode"));
|
||||
|
||||
// 서비스 본문 복호화처리
|
||||
// 인스던트 본문 복호화처리
|
||||
String strIncidentBody = (String)resultReqIncident.get("txIncidentBody");
|
||||
String strIncidentBodyDec = CommonUtil.base64decode(strIncidentBody);
|
||||
|
||||
@ -382,7 +382,7 @@ public class SvcDeskController
|
||||
}
|
||||
|
||||
/**
|
||||
* 서비스 데스크 서비스 수정 화면으로 이동한다.
|
||||
* 서비스 데스크 인스던트 수정 화면으로 이동한다.
|
||||
* @author urp 인프라본부 나혁제
|
||||
* 작성일 : 2025.02.13
|
||||
*/
|
||||
@ -433,7 +433,7 @@ public class SvcDeskController
|
||||
|
||||
// RestApi Call End ---------------------------------
|
||||
|
||||
// 서비스 본문 복호화처리
|
||||
// 인스던트 본문 복호화처리
|
||||
String strIncidentBody = (String)resultIncident.get("txIncidentBody");
|
||||
String strIncidentBodyDec = CommonUtil.base64decode(strIncidentBody);
|
||||
|
||||
@ -473,7 +473,7 @@ public class SvcDeskController
|
||||
}
|
||||
|
||||
/**
|
||||
* 서비스 데스크 서비스 새로만들기 화면으로 이동한다.
|
||||
* 서비스 데스크 인스던트 새로만들기 화면으로 이동한다.
|
||||
* @author urp 인프라본부 나혁제
|
||||
* 작성일 : 2026.01.21
|
||||
*/
|
||||
@ -522,7 +522,7 @@ public class SvcDeskController
|
||||
|
||||
// RestApi Call End ---------------------------------
|
||||
|
||||
// 서비스 본문 복호화처리
|
||||
// 인스던트 본문 복호화처리
|
||||
String strIncidentBody = (String)resultIncident.get("txIncidentBody");
|
||||
String strIncidentBodyDec = CommonUtil.base64decode(strIncidentBody);
|
||||
|
||||
@ -586,7 +586,7 @@ public class SvcDeskController
|
||||
|
||||
|
||||
/**
|
||||
* 서비스데스크 서비스 등록 처리를 한다.
|
||||
* 서비스데스크 인스던트 등록 처리를 한다.
|
||||
* @author urp 인프라본부 나혁제
|
||||
* 작성일 : 2025.02.13
|
||||
*/
|
||||
@ -701,26 +701,16 @@ public class SvcDeskController
|
||||
|
||||
String strReqApprovalYn = CommonUtil.getData(request, "reqApprovalYn");
|
||||
|
||||
// 2026.07.19 SR#12 : 등록(커밋) 이후의 메일발송 실패가 사용자에게 오류페이지로 노출되어
|
||||
// 'DB에는 등록됐는데 에러화면' 이중 결함을 유발하던 문제 → try/catch로 격리
|
||||
try
|
||||
// 접수처리 메일처리
|
||||
if(returnMap.get("resultCd").equals("0"))
|
||||
{
|
||||
// 접수처리 메일처리
|
||||
if(returnMap.get("resultCd").equals("0"))
|
||||
{
|
||||
commonService.sendIncidentMail(1, (int)returnMap.get("inIncidentSeq"));
|
||||
}
|
||||
|
||||
// 승인요청 메일처리
|
||||
if(strReqApprovalYn.equals("Y") && returnMap.get("resultCd").equals("0") )
|
||||
{
|
||||
commonService.sendIncidentMail(3, (int)returnMap.get("inIncidentSeq"));
|
||||
}
|
||||
commonService.sendIncidentMail(1, (int)returnMap.get("inIncidentSeq"));
|
||||
}
|
||||
catch(Exception mailEx)
|
||||
|
||||
// 승인요청 메일처리
|
||||
if(strReqApprovalYn.equals("Y") && returnMap.get("resultCd").equals("0") )
|
||||
{
|
||||
// 메일 발송 실패는 등록 결과에 영향을 주지 않음 (등록은 이미 정상 처리됨)
|
||||
log.error("서비스 등록 후 메일발송 실패(등록은 정상): {}", mailEx.getMessage());
|
||||
commonService.sendIncidentMail(3, (int)returnMap.get("inIncidentSeq"));
|
||||
}
|
||||
|
||||
log.info("<<<<<<<<<<<<<<< /srm/addIncident.do >>>>>>>>>>>>>>>");
|
||||
@ -729,7 +719,7 @@ public class SvcDeskController
|
||||
}
|
||||
|
||||
/**
|
||||
* 서비스데스크 서비스 수정 처리를 한다.
|
||||
* 서비스데스크 인스던트 수정 처리를 한다.
|
||||
* @author urp 인프라본부 나혁제
|
||||
* 작성일 : 2025.02.14
|
||||
*/
|
||||
@ -888,7 +878,7 @@ public class SvcDeskController
|
||||
}
|
||||
|
||||
/**
|
||||
* 서비스데스크 서비스 삭제 처리를 한다.
|
||||
* 서비스데스크 인스던트 삭제 처리를 한다.
|
||||
* @author urp 인프라본부 나혁제
|
||||
* 작성일 : 2025.02.24
|
||||
*/
|
||||
@ -925,7 +915,7 @@ public class SvcDeskController
|
||||
}
|
||||
|
||||
/**
|
||||
* 서비스데스크 서비스 승인요청 처리를 한다.
|
||||
* 서비스데스크 인스던트 승인요청 처리를 한다.
|
||||
* @author urp 인프라본부 나혁제
|
||||
* 작성일 : 2025.02.24
|
||||
*/
|
||||
@ -988,7 +978,7 @@ public class SvcDeskController
|
||||
|
||||
|
||||
/**
|
||||
* 서비스데스크 서비스 처리완료 처리를 한다.
|
||||
* 서비스데스크 인스던트 처리완료 처리를 한다.
|
||||
* @author urp 인프라본부 나혁제
|
||||
* 작성일 : 2025.02.15
|
||||
*/
|
||||
@ -1051,7 +1041,7 @@ public class SvcDeskController
|
||||
}
|
||||
|
||||
/**
|
||||
* 서비스 승인 처리를 한다.
|
||||
* 인스던트 승인 처리를 한다.
|
||||
* @author urp 인프라본부 나혁제
|
||||
* 작성일 : 2025.02.24
|
||||
*/
|
||||
@ -1113,7 +1103,7 @@ public class SvcDeskController
|
||||
}
|
||||
|
||||
/**
|
||||
* 서비스 반려 처리를 한다.
|
||||
* 인스던트 반려 처리를 한다.
|
||||
* @author urp 인프라본부 나혁제
|
||||
* 작성일 : 2025.02.24
|
||||
*/
|
||||
|
||||
@ -77,7 +77,7 @@ public class SvcDeskReqController
|
||||
CommonService commonService;
|
||||
|
||||
/**
|
||||
* 서비스 데스크 서비스 신청 목록을 조회한다.
|
||||
* 서비스 데스크 인스던트 신청 목록을 조회한다.
|
||||
* @author urp 인프라본부 나혁제
|
||||
* 작성일 : 2025.12.15
|
||||
*/
|
||||
@ -128,7 +128,7 @@ public class SvcDeskReqController
|
||||
}
|
||||
|
||||
/**
|
||||
* 서비스 데스크 서비스 신청 상세조회 화면으로 이동한다.
|
||||
* 서비스 데스크 인스던트 신청 상세조회 화면으로 이동한다.
|
||||
* @author URP 인프라본부 나혁제
|
||||
* 작성일 : 2025.12.16
|
||||
*/
|
||||
@ -165,7 +165,7 @@ public class SvcDeskReqController
|
||||
log.info("strCompletedYn [{}]", strCompletedYn );
|
||||
// RestApi Call End ---------------------------------
|
||||
|
||||
// 서비스 본문 복호화처리
|
||||
// 인스던트 본문 복호화처리
|
||||
String strIncidentBody = (String)resultReqIncident.get("txIncidentBody");
|
||||
String strIncidentBodyDec = CommonUtil.base64decode(strIncidentBody);
|
||||
|
||||
@ -220,7 +220,7 @@ public class SvcDeskReqController
|
||||
|
||||
|
||||
/**
|
||||
* 서비스 데스크 서비스 신청 등록 화면으로 이동한다.
|
||||
* 서비스 데스크 인스던트 신청 등록 화면으로 이동한다.
|
||||
* @author URP 인프라본부 나혁제
|
||||
* 작성일 : 2025.12.15
|
||||
*/
|
||||
@ -270,7 +270,7 @@ public class SvcDeskReqController
|
||||
}
|
||||
|
||||
/**
|
||||
* 서비스 데스크 서비스 신청 수정 화면으로 이동한다.
|
||||
* 서비스 데스크 인스던트 신청 수정 화면으로 이동한다.
|
||||
* @author URP 인프라본부 나혁제
|
||||
* 작성일 : 2025.12.16
|
||||
*/
|
||||
@ -300,7 +300,7 @@ public class SvcDeskReqController
|
||||
Map<String, Object> resultReqIncident = (Map<String, Object>)returnMap.get("resultReqIncident");
|
||||
// RestApi Call End ---------------------------------
|
||||
|
||||
// 서비스 본문 복호화처리
|
||||
// 인스던트 본문 복호화처리
|
||||
String strIncidentBody = (String)resultReqIncident.get("txIncidentBody");
|
||||
String strIncidentBodyDec = CommonUtil.base64decode(strIncidentBody);
|
||||
|
||||
@ -342,7 +342,7 @@ public class SvcDeskReqController
|
||||
|
||||
|
||||
/**
|
||||
* 서비스데스크 서비스 신청 등록 처리를 한다.
|
||||
* 서비스데스크 인스던트 신청 등록 처리를 한다.
|
||||
* @author URP 인프라본부 나혁제
|
||||
* 작성일 : 2025.12.15
|
||||
*/
|
||||
@ -421,7 +421,7 @@ public class SvcDeskReqController
|
||||
}
|
||||
|
||||
/**
|
||||
* 서비스데스크 서비스 신청 수정 처리를 한다.
|
||||
* 서비스데스크 인스던트 신청 수정 처리를 한다.
|
||||
* @author URP 인프라본부 나혁제
|
||||
* 작성일 : 2025.12.17
|
||||
*/
|
||||
@ -516,7 +516,7 @@ public class SvcDeskReqController
|
||||
}
|
||||
|
||||
/**
|
||||
* 서비스데스크 서비스 신청정보 삭제 처리를 한다.
|
||||
* 서비스데스크 인스던트 신청정보 삭제 처리를 한다.
|
||||
* @author urp 인프라본부 나혁제
|
||||
* 작성일 : 2025.12.18
|
||||
*/
|
||||
@ -553,7 +553,7 @@ public class SvcDeskReqController
|
||||
}
|
||||
|
||||
/**
|
||||
* 서비스 신청정보 반려 처리를 한다.
|
||||
* 인스던트 신청정보 반려 처리를 한다.
|
||||
* @author URP 인프라본부 나혁제
|
||||
* 작성일 : 2025.12.18
|
||||
*/
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
package com.urpsys.itmsfront.srm.domain;
|
||||
|
||||
/**
|
||||
* 서비스데스크 서비스 신청 처리 model 클래스를 정의한다.
|
||||
* 서비스데스크 인스던트 신청 처리 model 클래스를 정의한다.
|
||||
* @author urp 인프라본부 나혁제
|
||||
* @since 2025.12.15
|
||||
* @version 1.0
|
||||
|
||||
@ -1,278 +1,278 @@
|
||||
package com.urpsys.itmsfront.srm.domain;
|
||||
|
||||
/**
|
||||
* 서비스데스크 서비스 처리 model 클래스를 정의한다.
|
||||
* @author urp 인프라본부 나혁제
|
||||
* @since 2025.02.13
|
||||
* @version 1.0
|
||||
* @see
|
||||
*
|
||||
* <pre>
|
||||
* << 개정이력(Modification Information) >>
|
||||
*
|
||||
* 수정일 수정자 수정내용
|
||||
* ------- -------- ---------------------------
|
||||
* 2025.02.13 나혁제 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
|
||||
public class IncidentVo
|
||||
{
|
||||
private String inIncidentSeq ;
|
||||
private String inIncidentStatus ;
|
||||
private String vcIncidentNum ;
|
||||
private String inServiceCode ;
|
||||
private String vcServiceName ;
|
||||
private String inChargeUser ;
|
||||
private String vcChargeUser ;
|
||||
private String inDevUser ;
|
||||
private String vcDevUser ;
|
||||
private String dtReceiptDatetime ;
|
||||
private String dtReqDatetime ;
|
||||
private String dtCompleteDatetime ;
|
||||
private String vcIncidentTitle ;
|
||||
private String txIncidentBody ;
|
||||
private String vcIncidentStatus ;
|
||||
private String inRegUser ;
|
||||
private String vcRegUser ;
|
||||
private String inReqApprovalUser ;
|
||||
private String vcReqApprovalUser ;
|
||||
private String dtReqApprovalDatetime ;
|
||||
private String txReqApprovalComment ;
|
||||
private String vcCompleted ;
|
||||
private String inCompleted ;
|
||||
private String txCompletedComment ;
|
||||
private String inDifficulty ;
|
||||
private String inSatisfaction ;
|
||||
private String vcServiceTarget ;
|
||||
private String vcRequestDept ;
|
||||
private String vcRequestUser ;
|
||||
private String dtServiceStartDatetime ;
|
||||
private String atchFileId ;
|
||||
private String atchFileInUpGb ;
|
||||
private String vcReqIncidentNum ; // 2025.12.17 나혁제 신청번호
|
||||
private String reqAtchFileId ; // 2025.12.17 나혁제 신청첨부파일
|
||||
private String reqRptRejTxComment ; // 2025.12.17 나혁제 접수의견
|
||||
|
||||
public String getInIncidentSeq() {
|
||||
return inIncidentSeq;
|
||||
}
|
||||
public void setInIncidentSeq(String inIncidentSeq) {
|
||||
this.inIncidentSeq = inIncidentSeq;
|
||||
}
|
||||
public String getInIncidentStatus() {
|
||||
return inIncidentStatus;
|
||||
}
|
||||
public void setInIncidentStatus(String inIncidentStatus) {
|
||||
this.inIncidentStatus = inIncidentStatus;
|
||||
}
|
||||
public String getVcIncidentNum() {
|
||||
return vcIncidentNum;
|
||||
}
|
||||
public void setVcIncidentNum(String vcIncidentNum) {
|
||||
this.vcIncidentNum = vcIncidentNum;
|
||||
}
|
||||
public String getInServiceCode() {
|
||||
return inServiceCode;
|
||||
}
|
||||
public void setInServiceCode(String inServiceCode) {
|
||||
this.inServiceCode = inServiceCode;
|
||||
}
|
||||
public String getVcServiceName() {
|
||||
return vcServiceName;
|
||||
}
|
||||
public void setVcServiceName(String vcServiceName) {
|
||||
this.vcServiceName = vcServiceName;
|
||||
}
|
||||
public String getInChargeUser() {
|
||||
return inChargeUser;
|
||||
}
|
||||
public void setInChargeUser(String inChargeUser) {
|
||||
this.inChargeUser = inChargeUser;
|
||||
}
|
||||
public String getVcChargeUser() {
|
||||
return vcChargeUser;
|
||||
}
|
||||
public void setVcChargeUser(String vcChargeUser) {
|
||||
this.vcChargeUser = vcChargeUser;
|
||||
}
|
||||
public String getInDevUser() {
|
||||
return inDevUser;
|
||||
}
|
||||
public void setInDevUser(String inDevUser) {
|
||||
this.inDevUser = inDevUser;
|
||||
}
|
||||
public String getVcDevUser() {
|
||||
return vcDevUser;
|
||||
}
|
||||
public void setVcDevUser(String vcDevUser) {
|
||||
this.vcDevUser = vcDevUser;
|
||||
}
|
||||
public String getDtReceiptDatetime() {
|
||||
return dtReceiptDatetime;
|
||||
}
|
||||
public void setDtReceiptDatetime(String dtReceiptDatetime) {
|
||||
this.dtReceiptDatetime = dtReceiptDatetime;
|
||||
}
|
||||
public String getDtReqDatetime() {
|
||||
return dtReqDatetime;
|
||||
}
|
||||
public void setDtReqDatetime(String dtReqDatetime) {
|
||||
this.dtReqDatetime = dtReqDatetime;
|
||||
}
|
||||
public String getDtCompleteDatetime() {
|
||||
return dtCompleteDatetime;
|
||||
}
|
||||
public void setDtCompleteDatetime(String dtCompleteDatetime) {
|
||||
this.dtCompleteDatetime = dtCompleteDatetime;
|
||||
}
|
||||
public String getVcIncidentTitle() {
|
||||
return vcIncidentTitle;
|
||||
}
|
||||
public void setVcIncidentTitle(String vcIncidentTitle) {
|
||||
this.vcIncidentTitle = vcIncidentTitle;
|
||||
}
|
||||
public String getTxIncidentBody() {
|
||||
return txIncidentBody;
|
||||
}
|
||||
public void setTxIncidentBody(String txIncidentBody) {
|
||||
this.txIncidentBody = txIncidentBody;
|
||||
}
|
||||
public String getVcIncidentStatus() {
|
||||
return vcIncidentStatus;
|
||||
}
|
||||
public void setVcIncidentStatus(String vcIncidentStatus) {
|
||||
this.vcIncidentStatus = vcIncidentStatus;
|
||||
}
|
||||
public String getInRegUser() {
|
||||
return inRegUser;
|
||||
}
|
||||
public void setInRegUser(String inRegUser) {
|
||||
this.inRegUser = inRegUser;
|
||||
}
|
||||
public String getVcRegUser() {
|
||||
return vcRegUser;
|
||||
}
|
||||
public void setVcRegUser(String vcRegUser) {
|
||||
this.vcRegUser = vcRegUser;
|
||||
}
|
||||
public String getInReqApprovalUser() {
|
||||
return inReqApprovalUser;
|
||||
}
|
||||
public void setInReqApprovalUser(String inReqApprovalUser) {
|
||||
this.inReqApprovalUser = inReqApprovalUser;
|
||||
}
|
||||
public String getVcReqApprovalUser() {
|
||||
return vcReqApprovalUser;
|
||||
}
|
||||
public void setVcReqApprovalUser(String vcReqApprovalUser) {
|
||||
this.vcReqApprovalUser = vcReqApprovalUser;
|
||||
}
|
||||
public String getDtReqApprovalDatetime() {
|
||||
return dtReqApprovalDatetime;
|
||||
}
|
||||
public void setDtReqApprovalDatetime(String dtReqApprovalDatetime) {
|
||||
this.dtReqApprovalDatetime = dtReqApprovalDatetime;
|
||||
}
|
||||
public String getTxReqApprovalComment() {
|
||||
return txReqApprovalComment;
|
||||
}
|
||||
public void setTxReqApprovalComment(String txReqApprovalComment) {
|
||||
this.txReqApprovalComment = txReqApprovalComment;
|
||||
}
|
||||
public String getVcCompleted() {
|
||||
return vcCompleted;
|
||||
}
|
||||
public void setVcCompleted(String vcCompleted) {
|
||||
this.vcCompleted = vcCompleted;
|
||||
}
|
||||
public String getInCompleted() {
|
||||
return inCompleted;
|
||||
}
|
||||
public void setInCompleted(String inCompleted) {
|
||||
this.inCompleted = inCompleted;
|
||||
}
|
||||
public String getTxCompletedComment() {
|
||||
return txCompletedComment;
|
||||
}
|
||||
public void setTxCompletedComment(String txCompletedComment) {
|
||||
this.txCompletedComment = txCompletedComment;
|
||||
}
|
||||
public String getInDifficulty() {
|
||||
return inDifficulty;
|
||||
}
|
||||
public void setInDifficulty(String inDifficulty) {
|
||||
this.inDifficulty = inDifficulty;
|
||||
}
|
||||
public String getInSatisfaction() {
|
||||
return inSatisfaction;
|
||||
}
|
||||
public void setInSatisfaction(String inSatisfaction) {
|
||||
this.inSatisfaction = inSatisfaction;
|
||||
}
|
||||
public String getVcServiceTarget() {
|
||||
return vcServiceTarget;
|
||||
}
|
||||
public void setVcServiceTarget(String vcServiceTarget) {
|
||||
this.vcServiceTarget = vcServiceTarget;
|
||||
}
|
||||
public String getVcRequestDept() {
|
||||
return vcRequestDept;
|
||||
}
|
||||
public void setVcRequestDept(String vcRequestDept) {
|
||||
this.vcRequestDept = vcRequestDept;
|
||||
}
|
||||
public String getVcRequestUser() {
|
||||
return vcRequestUser;
|
||||
}
|
||||
public void setVcRequestUser(String vcRequestUser) {
|
||||
this.vcRequestUser = vcRequestUser;
|
||||
}
|
||||
public String getDtServiceStartDatetime() {
|
||||
return dtServiceStartDatetime;
|
||||
}
|
||||
public void setDtServiceStartDatetime(String dtServiceStartDatetime) {
|
||||
this.dtServiceStartDatetime = dtServiceStartDatetime;
|
||||
}
|
||||
public String getAtchFileId() {
|
||||
return atchFileId;
|
||||
}
|
||||
public void setAtchFileId(String atchFileId) {
|
||||
this.atchFileId = atchFileId;
|
||||
}
|
||||
public String getAtchFileInUpGb() {
|
||||
return atchFileInUpGb;
|
||||
}
|
||||
public void setAtchFileInUpGb(String atchFileInUpGb) {
|
||||
this.atchFileInUpGb = atchFileInUpGb;
|
||||
}
|
||||
public String getVcReqIncidentNum() {
|
||||
return vcReqIncidentNum;
|
||||
}
|
||||
public void setVcReqIncidentNum(String vcReqIncidentNum) {
|
||||
this.vcReqIncidentNum = vcReqIncidentNum;
|
||||
}
|
||||
public String getReqAtchFileId() {
|
||||
return reqAtchFileId;
|
||||
}
|
||||
public void setReqAtchFileId(String reqAtchFileId) {
|
||||
this.reqAtchFileId = reqAtchFileId;
|
||||
}
|
||||
public String getReqRptRejTxComment() {
|
||||
return reqRptRejTxComment;
|
||||
}
|
||||
public void setReqRptRejTxComment(String reqRptRejTxComment) {
|
||||
this.reqRptRejTxComment = reqRptRejTxComment;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
package com.urpsys.itmsfront.srm.domain;
|
||||
|
||||
/**
|
||||
* 서비스데스크 인스던트 처리 model 클래스를 정의한다.
|
||||
* @author urp 인프라본부 나혁제
|
||||
* @since 2025.02.13
|
||||
* @version 1.0
|
||||
* @see
|
||||
*
|
||||
* <pre>
|
||||
* << 개정이력(Modification Information) >>
|
||||
*
|
||||
* 수정일 수정자 수정내용
|
||||
* ------- -------- ---------------------------
|
||||
* 2025.02.13 나혁제 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
|
||||
public class IncidentVo
|
||||
{
|
||||
private String inIncidentSeq ;
|
||||
private String inIncidentStatus ;
|
||||
private String vcIncidentNum ;
|
||||
private String inServiceCode ;
|
||||
private String vcServiceName ;
|
||||
private String inChargeUser ;
|
||||
private String vcChargeUser ;
|
||||
private String inDevUser ;
|
||||
private String vcDevUser ;
|
||||
private String dtReceiptDatetime ;
|
||||
private String dtReqDatetime ;
|
||||
private String dtCompleteDatetime ;
|
||||
private String vcIncidentTitle ;
|
||||
private String txIncidentBody ;
|
||||
private String vcIncidentStatus ;
|
||||
private String inRegUser ;
|
||||
private String vcRegUser ;
|
||||
private String inReqApprovalUser ;
|
||||
private String vcReqApprovalUser ;
|
||||
private String dtReqApprovalDatetime ;
|
||||
private String txReqApprovalComment ;
|
||||
private String vcCompleted ;
|
||||
private String inCompleted ;
|
||||
private String txCompletedComment ;
|
||||
private String inDifficulty ;
|
||||
private String inSatisfaction ;
|
||||
private String vcServiceTarget ;
|
||||
private String vcRequestDept ;
|
||||
private String vcRequestUser ;
|
||||
private String dtServiceStartDatetime ;
|
||||
private String atchFileId ;
|
||||
private String atchFileInUpGb ;
|
||||
private String vcReqIncidentNum ; // 2025.12.17 나혁제 신청번호
|
||||
private String reqAtchFileId ; // 2025.12.17 나혁제 신청첨부파일
|
||||
private String reqRptRejTxComment ; // 2025.12.17 나혁제 접수의견
|
||||
|
||||
public String getInIncidentSeq() {
|
||||
return inIncidentSeq;
|
||||
}
|
||||
public void setInIncidentSeq(String inIncidentSeq) {
|
||||
this.inIncidentSeq = inIncidentSeq;
|
||||
}
|
||||
public String getInIncidentStatus() {
|
||||
return inIncidentStatus;
|
||||
}
|
||||
public void setInIncidentStatus(String inIncidentStatus) {
|
||||
this.inIncidentStatus = inIncidentStatus;
|
||||
}
|
||||
public String getVcIncidentNum() {
|
||||
return vcIncidentNum;
|
||||
}
|
||||
public void setVcIncidentNum(String vcIncidentNum) {
|
||||
this.vcIncidentNum = vcIncidentNum;
|
||||
}
|
||||
public String getInServiceCode() {
|
||||
return inServiceCode;
|
||||
}
|
||||
public void setInServiceCode(String inServiceCode) {
|
||||
this.inServiceCode = inServiceCode;
|
||||
}
|
||||
public String getVcServiceName() {
|
||||
return vcServiceName;
|
||||
}
|
||||
public void setVcServiceName(String vcServiceName) {
|
||||
this.vcServiceName = vcServiceName;
|
||||
}
|
||||
public String getInChargeUser() {
|
||||
return inChargeUser;
|
||||
}
|
||||
public void setInChargeUser(String inChargeUser) {
|
||||
this.inChargeUser = inChargeUser;
|
||||
}
|
||||
public String getVcChargeUser() {
|
||||
return vcChargeUser;
|
||||
}
|
||||
public void setVcChargeUser(String vcChargeUser) {
|
||||
this.vcChargeUser = vcChargeUser;
|
||||
}
|
||||
public String getInDevUser() {
|
||||
return inDevUser;
|
||||
}
|
||||
public void setInDevUser(String inDevUser) {
|
||||
this.inDevUser = inDevUser;
|
||||
}
|
||||
public String getVcDevUser() {
|
||||
return vcDevUser;
|
||||
}
|
||||
public void setVcDevUser(String vcDevUser) {
|
||||
this.vcDevUser = vcDevUser;
|
||||
}
|
||||
public String getDtReceiptDatetime() {
|
||||
return dtReceiptDatetime;
|
||||
}
|
||||
public void setDtReceiptDatetime(String dtReceiptDatetime) {
|
||||
this.dtReceiptDatetime = dtReceiptDatetime;
|
||||
}
|
||||
public String getDtReqDatetime() {
|
||||
return dtReqDatetime;
|
||||
}
|
||||
public void setDtReqDatetime(String dtReqDatetime) {
|
||||
this.dtReqDatetime = dtReqDatetime;
|
||||
}
|
||||
public String getDtCompleteDatetime() {
|
||||
return dtCompleteDatetime;
|
||||
}
|
||||
public void setDtCompleteDatetime(String dtCompleteDatetime) {
|
||||
this.dtCompleteDatetime = dtCompleteDatetime;
|
||||
}
|
||||
public String getVcIncidentTitle() {
|
||||
return vcIncidentTitle;
|
||||
}
|
||||
public void setVcIncidentTitle(String vcIncidentTitle) {
|
||||
this.vcIncidentTitle = vcIncidentTitle;
|
||||
}
|
||||
public String getTxIncidentBody() {
|
||||
return txIncidentBody;
|
||||
}
|
||||
public void setTxIncidentBody(String txIncidentBody) {
|
||||
this.txIncidentBody = txIncidentBody;
|
||||
}
|
||||
public String getVcIncidentStatus() {
|
||||
return vcIncidentStatus;
|
||||
}
|
||||
public void setVcIncidentStatus(String vcIncidentStatus) {
|
||||
this.vcIncidentStatus = vcIncidentStatus;
|
||||
}
|
||||
public String getInRegUser() {
|
||||
return inRegUser;
|
||||
}
|
||||
public void setInRegUser(String inRegUser) {
|
||||
this.inRegUser = inRegUser;
|
||||
}
|
||||
public String getVcRegUser() {
|
||||
return vcRegUser;
|
||||
}
|
||||
public void setVcRegUser(String vcRegUser) {
|
||||
this.vcRegUser = vcRegUser;
|
||||
}
|
||||
public String getInReqApprovalUser() {
|
||||
return inReqApprovalUser;
|
||||
}
|
||||
public void setInReqApprovalUser(String inReqApprovalUser) {
|
||||
this.inReqApprovalUser = inReqApprovalUser;
|
||||
}
|
||||
public String getVcReqApprovalUser() {
|
||||
return vcReqApprovalUser;
|
||||
}
|
||||
public void setVcReqApprovalUser(String vcReqApprovalUser) {
|
||||
this.vcReqApprovalUser = vcReqApprovalUser;
|
||||
}
|
||||
public String getDtReqApprovalDatetime() {
|
||||
return dtReqApprovalDatetime;
|
||||
}
|
||||
public void setDtReqApprovalDatetime(String dtReqApprovalDatetime) {
|
||||
this.dtReqApprovalDatetime = dtReqApprovalDatetime;
|
||||
}
|
||||
public String getTxReqApprovalComment() {
|
||||
return txReqApprovalComment;
|
||||
}
|
||||
public void setTxReqApprovalComment(String txReqApprovalComment) {
|
||||
this.txReqApprovalComment = txReqApprovalComment;
|
||||
}
|
||||
public String getVcCompleted() {
|
||||
return vcCompleted;
|
||||
}
|
||||
public void setVcCompleted(String vcCompleted) {
|
||||
this.vcCompleted = vcCompleted;
|
||||
}
|
||||
public String getInCompleted() {
|
||||
return inCompleted;
|
||||
}
|
||||
public void setInCompleted(String inCompleted) {
|
||||
this.inCompleted = inCompleted;
|
||||
}
|
||||
public String getTxCompletedComment() {
|
||||
return txCompletedComment;
|
||||
}
|
||||
public void setTxCompletedComment(String txCompletedComment) {
|
||||
this.txCompletedComment = txCompletedComment;
|
||||
}
|
||||
public String getInDifficulty() {
|
||||
return inDifficulty;
|
||||
}
|
||||
public void setInDifficulty(String inDifficulty) {
|
||||
this.inDifficulty = inDifficulty;
|
||||
}
|
||||
public String getInSatisfaction() {
|
||||
return inSatisfaction;
|
||||
}
|
||||
public void setInSatisfaction(String inSatisfaction) {
|
||||
this.inSatisfaction = inSatisfaction;
|
||||
}
|
||||
public String getVcServiceTarget() {
|
||||
return vcServiceTarget;
|
||||
}
|
||||
public void setVcServiceTarget(String vcServiceTarget) {
|
||||
this.vcServiceTarget = vcServiceTarget;
|
||||
}
|
||||
public String getVcRequestDept() {
|
||||
return vcRequestDept;
|
||||
}
|
||||
public void setVcRequestDept(String vcRequestDept) {
|
||||
this.vcRequestDept = vcRequestDept;
|
||||
}
|
||||
public String getVcRequestUser() {
|
||||
return vcRequestUser;
|
||||
}
|
||||
public void setVcRequestUser(String vcRequestUser) {
|
||||
this.vcRequestUser = vcRequestUser;
|
||||
}
|
||||
public String getDtServiceStartDatetime() {
|
||||
return dtServiceStartDatetime;
|
||||
}
|
||||
public void setDtServiceStartDatetime(String dtServiceStartDatetime) {
|
||||
this.dtServiceStartDatetime = dtServiceStartDatetime;
|
||||
}
|
||||
public String getAtchFileId() {
|
||||
return atchFileId;
|
||||
}
|
||||
public void setAtchFileId(String atchFileId) {
|
||||
this.atchFileId = atchFileId;
|
||||
}
|
||||
public String getAtchFileInUpGb() {
|
||||
return atchFileInUpGb;
|
||||
}
|
||||
public void setAtchFileInUpGb(String atchFileInUpGb) {
|
||||
this.atchFileInUpGb = atchFileInUpGb;
|
||||
}
|
||||
public String getVcReqIncidentNum() {
|
||||
return vcReqIncidentNum;
|
||||
}
|
||||
public void setVcReqIncidentNum(String vcReqIncidentNum) {
|
||||
this.vcReqIncidentNum = vcReqIncidentNum;
|
||||
}
|
||||
public String getReqAtchFileId() {
|
||||
return reqAtchFileId;
|
||||
}
|
||||
public void setReqAtchFileId(String reqAtchFileId) {
|
||||
this.reqAtchFileId = reqAtchFileId;
|
||||
}
|
||||
public String getReqRptRejTxComment() {
|
||||
return reqRptRejTxComment;
|
||||
}
|
||||
public void setReqRptRejTxComment(String reqRptRejTxComment) {
|
||||
this.reqRptRejTxComment = reqRptRejTxComment;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
@ -29,7 +29,6 @@ function drawEditorWrite(strBody, content)
|
||||
selector: strSelector,
|
||||
height: 300,
|
||||
min_height: 300, // 최소 높이
|
||||
max_height: 600, // 2026.07.19 SR#13 최대 높이 제한 (초과 시 에디터 내부 스크롤)
|
||||
toolbar_mode: 'floating',
|
||||
//image upload
|
||||
image_title: true,
|
||||
@ -135,7 +134,6 @@ function drawEditorRead(strBody, content)
|
||||
selector: strSelector,
|
||||
height: 300,
|
||||
min_height: 300, // 최소 높이
|
||||
max_height: 600, // 2026.07.19 SR#13 최대 높이 제한 (초과 시 에디터 내부 스크롤)
|
||||
toolbar_mode: 'floating',
|
||||
// readonly: 1,
|
||||
menubar: false,
|
||||
|
||||
@ -1,189 +1,189 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE form-validation PUBLIC
|
||||
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1//EN"
|
||||
"http://jakarta.apache.org/commons/dtds/validator_1_1.dtd">
|
||||
|
||||
<form-validation>
|
||||
<formset>
|
||||
<!-- 자산처리 -->
|
||||
<form name="resourceManage">
|
||||
<field property="vcAssetName" depends="required">
|
||||
<arg0 key="자산명" />
|
||||
</field>
|
||||
<field property="vcAssetId" depends="required, maxlength">
|
||||
<arg0 key="자산번호" />
|
||||
<arg1 key="50" resource="true"/>
|
||||
<var>
|
||||
<var-name>maxlength</var-name>
|
||||
<var-value>50</var-value>
|
||||
</var>
|
||||
</field>
|
||||
<field property="inPrice" depends="required">
|
||||
<arg0 key="도입금맥" />
|
||||
</field>
|
||||
<field property="inPrice" depends="integer">
|
||||
<arg0 key="도입금액" resource="true"/>
|
||||
</field>
|
||||
<field property="inMasRate" depends="required">
|
||||
<arg0 key="유지보수요율" />
|
||||
</field>
|
||||
<field property="inMasRate" depends="integer">
|
||||
<arg0 key="유지보수요율" resource="true"/>
|
||||
</field>
|
||||
<field property="inPortInfo" depends="integer">
|
||||
<arg0 key="포트정보" resource="true"/>
|
||||
</field>
|
||||
</form>
|
||||
|
||||
<!-- 서비스 정보 -->
|
||||
<form name="adminServiceManage">
|
||||
<field property="vcServiceName" depends="required">
|
||||
<arg0 key="서비스명" resource="true"/>
|
||||
</field>
|
||||
<field property="inSortSn" depends="integer">
|
||||
<arg0 key="정렬순서" resource="true"/>
|
||||
</field>
|
||||
</form>
|
||||
|
||||
<!-- 보고서양식 정보 -->
|
||||
<form name="reportManage">
|
||||
<field property="vcFormName" depends="required">
|
||||
<arg0 key="보고서명" resource="true"/>
|
||||
</field>
|
||||
<field property="inSortSn" depends="integer">
|
||||
<arg0 key="정렬순서" resource="true"/>
|
||||
</field>
|
||||
</form>
|
||||
|
||||
<!-- 서비스데스크 서비스 처리 -->
|
||||
<form name="svcDeskManage">
|
||||
<field property="XXXXXXX" depends="">
|
||||
</field>
|
||||
<field property="vcChargeUser" depends="required">
|
||||
<arg0 key="조치예정자" resource="true"/>
|
||||
</field>
|
||||
<field property="vcIncidentTitle" depends="required">
|
||||
<arg0 key="제목" resource="true"/>
|
||||
</field>
|
||||
<field property="approvalsId" depends="required">
|
||||
<arg0 key="결재라인" resource="true"/>
|
||||
</field>
|
||||
</form>
|
||||
|
||||
<!-- 서비스데스크 서비스 처리 -->
|
||||
<form name="svcDeskReqManage">
|
||||
<field property="XXXXXXX" depends="">
|
||||
</field>
|
||||
<field property="vcChargeUser" depends="required">
|
||||
<arg0 key="조치예정자" resource="true"/>
|
||||
</field>
|
||||
<field property="vcIncidentTitle" depends="required">
|
||||
<arg0 key="제목" resource="true"/>
|
||||
</field>
|
||||
|
||||
</form>
|
||||
|
||||
|
||||
<!-- 점검보고서 처리 -->
|
||||
<form name="reportCheckManage">
|
||||
<field property="XXXXXXX" depends="">
|
||||
</field>
|
||||
<field property="vcReportTitle" depends="required">
|
||||
<arg0 key="제목" />
|
||||
</field>
|
||||
</form>
|
||||
|
||||
<!-- 장애보고서 처리 -->
|
||||
<form name="reportErrorManage">
|
||||
<field property="XXXXXXX" depends="">
|
||||
</field>
|
||||
<field property="vcReportTitle" depends="required">
|
||||
<arg0 key="제목" />
|
||||
</field>
|
||||
</form>
|
||||
|
||||
<!-- 이슈보고서 처리 -->
|
||||
<form name="reportIssueManage">
|
||||
<field property="XXXXXXX" depends="">
|
||||
</field>
|
||||
<field property="vcReportTitle" depends="required">
|
||||
<arg0 key="제목" />
|
||||
</field>
|
||||
</form>
|
||||
|
||||
<!-- 이슈보고서 처리 -->
|
||||
<form name="reportOtherManage">
|
||||
<field property="XXXXXXX" depends="">
|
||||
</field>
|
||||
<field property="vcReportTitle" depends="required">
|
||||
<arg0 key="제목" />
|
||||
</field>
|
||||
</form>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!--
|
||||
<form name="adbk">
|
||||
<field property="adbkNm" depends="required, maxlength">
|
||||
<arg0 key="comCopAdb.regist.adbkNm" />
|
||||
<arg1 key="60" resource="true"/>
|
||||
<var>
|
||||
<var-name>maxlength</var-name>
|
||||
<var-value>50</var-value>
|
||||
</var>
|
||||
</field>
|
||||
<field property="othbcScope" depends="required">
|
||||
<arg0 key="comCopAdb.regist.othbcScope" />
|
||||
</field>
|
||||
</form>
|
||||
|
||||
|
||||
|
||||
<form name="trsmrcvMntrng">
|
||||
<field property="cntcId" depends="required, maxlength">
|
||||
<arg0 key="연계ID" resource="true"/>
|
||||
<arg1 key="8" resource="true"/>
|
||||
<var>
|
||||
<var-name>maxlength</var-name>
|
||||
<var-value>8</var-value>
|
||||
</var>
|
||||
</field>
|
||||
|
||||
<field property="testClassNm" depends="required, maxlength">
|
||||
<arg0 key="테스트클래스명" resource="true"/>
|
||||
<arg1 key="255" resource="true"/>
|
||||
<var>
|
||||
<var-name>maxlength</var-name>
|
||||
<var-value>255</var-value>
|
||||
</var>
|
||||
</field>
|
||||
|
||||
<field property="mngrNm" depends="required, maxlength">
|
||||
<arg0 key="관리자명" resource="true"/>
|
||||
<arg1 key="60" resource="true"/>
|
||||
<var>
|
||||
<var-name>maxlength</var-name>
|
||||
<var-value>60</var-value>
|
||||
</var>
|
||||
</field>
|
||||
|
||||
<field property="mngrEmailAddr" depends="required, maxlength, email">
|
||||
<arg0 key="관리자이메일주소" resource="true"/>
|
||||
<arg1 key="50" resource="true"/>
|
||||
<var>
|
||||
<var-name>maxlength</var-name>
|
||||
<var-value>50</var-value>
|
||||
</var>
|
||||
</field>
|
||||
|
||||
</form>
|
||||
-->
|
||||
|
||||
</formset>
|
||||
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE form-validation PUBLIC
|
||||
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1//EN"
|
||||
"http://jakarta.apache.org/commons/dtds/validator_1_1.dtd">
|
||||
|
||||
<form-validation>
|
||||
<formset>
|
||||
<!-- 자산처리 -->
|
||||
<form name="resourceManage">
|
||||
<field property="vcAssetName" depends="required">
|
||||
<arg0 key="자산명" />
|
||||
</field>
|
||||
<field property="vcAssetId" depends="required, maxlength">
|
||||
<arg0 key="자산번호" />
|
||||
<arg1 key="50" resource="true"/>
|
||||
<var>
|
||||
<var-name>maxlength</var-name>
|
||||
<var-value>50</var-value>
|
||||
</var>
|
||||
</field>
|
||||
<field property="inPrice" depends="required">
|
||||
<arg0 key="도입금맥" />
|
||||
</field>
|
||||
<field property="inPrice" depends="integer">
|
||||
<arg0 key="도입금액" resource="true"/>
|
||||
</field>
|
||||
<field property="inMasRate" depends="required">
|
||||
<arg0 key="유지보수요율" />
|
||||
</field>
|
||||
<field property="inMasRate" depends="integer">
|
||||
<arg0 key="유지보수요율" resource="true"/>
|
||||
</field>
|
||||
<field property="inPortInfo" depends="integer">
|
||||
<arg0 key="포트정보" resource="true"/>
|
||||
</field>
|
||||
</form>
|
||||
|
||||
<!-- 서비스 정보 -->
|
||||
<form name="adminServiceManage">
|
||||
<field property="vcServiceName" depends="required">
|
||||
<arg0 key="서비스명" resource="true"/>
|
||||
</field>
|
||||
<field property="inSortSn" depends="integer">
|
||||
<arg0 key="정렬순서" resource="true"/>
|
||||
</field>
|
||||
</form>
|
||||
|
||||
<!-- 보고서양식 정보 -->
|
||||
<form name="reportManage">
|
||||
<field property="vcFormName" depends="required">
|
||||
<arg0 key="보고서명" resource="true"/>
|
||||
</field>
|
||||
<field property="inSortSn" depends="integer">
|
||||
<arg0 key="정렬순서" resource="true"/>
|
||||
</field>
|
||||
</form>
|
||||
|
||||
<!-- 서비스데스크 인스던트 처리 -->
|
||||
<form name="svcDeskManage">
|
||||
<field property="XXXXXXX" depends="">
|
||||
</field>
|
||||
<field property="vcChargeUser" depends="required">
|
||||
<arg0 key="조치예정자" resource="true"/>
|
||||
</field>
|
||||
<field property="vcIncidentTitle" depends="required">
|
||||
<arg0 key="제목" resource="true"/>
|
||||
</field>
|
||||
<field property="approvalsId" depends="required">
|
||||
<arg0 key="결재라인" resource="true"/>
|
||||
</field>
|
||||
</form>
|
||||
|
||||
<!-- 서비스데스크 인스던트 처리 -->
|
||||
<form name="svcDeskReqManage">
|
||||
<field property="XXXXXXX" depends="">
|
||||
</field>
|
||||
<field property="vcChargeUser" depends="required">
|
||||
<arg0 key="조치예정자" resource="true"/>
|
||||
</field>
|
||||
<field property="vcIncidentTitle" depends="required">
|
||||
<arg0 key="제목" resource="true"/>
|
||||
</field>
|
||||
|
||||
</form>
|
||||
|
||||
|
||||
<!-- 점검보고서 처리 -->
|
||||
<form name="reportCheckManage">
|
||||
<field property="XXXXXXX" depends="">
|
||||
</field>
|
||||
<field property="vcReportTitle" depends="required">
|
||||
<arg0 key="제목" />
|
||||
</field>
|
||||
</form>
|
||||
|
||||
<!-- 장애보고서 처리 -->
|
||||
<form name="reportErrorManage">
|
||||
<field property="XXXXXXX" depends="">
|
||||
</field>
|
||||
<field property="vcReportTitle" depends="required">
|
||||
<arg0 key="제목" />
|
||||
</field>
|
||||
</form>
|
||||
|
||||
<!-- 이슈보고서 처리 -->
|
||||
<form name="reportIssueManage">
|
||||
<field property="XXXXXXX" depends="">
|
||||
</field>
|
||||
<field property="vcReportTitle" depends="required">
|
||||
<arg0 key="제목" />
|
||||
</field>
|
||||
</form>
|
||||
|
||||
<!-- 이슈보고서 처리 -->
|
||||
<form name="reportOtherManage">
|
||||
<field property="XXXXXXX" depends="">
|
||||
</field>
|
||||
<field property="vcReportTitle" depends="required">
|
||||
<arg0 key="제목" />
|
||||
</field>
|
||||
</form>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!--
|
||||
<form name="adbk">
|
||||
<field property="adbkNm" depends="required, maxlength">
|
||||
<arg0 key="comCopAdb.regist.adbkNm" />
|
||||
<arg1 key="60" resource="true"/>
|
||||
<var>
|
||||
<var-name>maxlength</var-name>
|
||||
<var-value>50</var-value>
|
||||
</var>
|
||||
</field>
|
||||
<field property="othbcScope" depends="required">
|
||||
<arg0 key="comCopAdb.regist.othbcScope" />
|
||||
</field>
|
||||
</form>
|
||||
|
||||
|
||||
|
||||
<form name="trsmrcvMntrng">
|
||||
<field property="cntcId" depends="required, maxlength">
|
||||
<arg0 key="연계ID" resource="true"/>
|
||||
<arg1 key="8" resource="true"/>
|
||||
<var>
|
||||
<var-name>maxlength</var-name>
|
||||
<var-value>8</var-value>
|
||||
</var>
|
||||
</field>
|
||||
|
||||
<field property="testClassNm" depends="required, maxlength">
|
||||
<arg0 key="테스트클래스명" resource="true"/>
|
||||
<arg1 key="255" resource="true"/>
|
||||
<var>
|
||||
<var-name>maxlength</var-name>
|
||||
<var-value>255</var-value>
|
||||
</var>
|
||||
</field>
|
||||
|
||||
<field property="mngrNm" depends="required, maxlength">
|
||||
<arg0 key="관리자명" resource="true"/>
|
||||
<arg1 key="60" resource="true"/>
|
||||
<var>
|
||||
<var-name>maxlength</var-name>
|
||||
<var-value>60</var-value>
|
||||
</var>
|
||||
</field>
|
||||
|
||||
<field property="mngrEmailAddr" depends="required, maxlength, email">
|
||||
<arg0 key="관리자이메일주소" resource="true"/>
|
||||
<arg1 key="50" resource="true"/>
|
||||
<var>
|
||||
<var-name>maxlength</var-name>
|
||||
<var-value>50</var-value>
|
||||
</var>
|
||||
</field>
|
||||
|
||||
</form>
|
||||
-->
|
||||
|
||||
</formset>
|
||||
|
||||
</form-validation>
|
||||
@ -1,115 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<%--
|
||||
* @Class Name : brandingManage.jsp
|
||||
* @Description : 2026.07.19 기능개선12/F12 — 로고/파비콘 교체 관리(KIC 브랜딩)
|
||||
* @author URP 인프라본부
|
||||
--%>
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
|
||||
<title> 로고/파비콘 관리 </title>
|
||||
|
||||
<script type="text/javaScript" language="javascript">
|
||||
|
||||
function fncUpload(kind)
|
||||
{
|
||||
var inputId = (kind == 'logo') ? 'logoFile' : 'faviconFile';
|
||||
var f = document.getElementById(inputId);
|
||||
if(!f || f.files.length == 0)
|
||||
{
|
||||
alert("파일을 선택해 주세요.");
|
||||
return;
|
||||
}
|
||||
|
||||
var formData = new FormData();
|
||||
formData.append("kind", kind);
|
||||
formData.append("file", f.files[0]);
|
||||
|
||||
$.ajax({
|
||||
url: '<c:url value="/branding/upload.do"/>'
|
||||
, type: 'post'
|
||||
, data: formData
|
||||
, processData: false
|
||||
, contentType: false
|
||||
, cache: false
|
||||
, dataType: 'json'
|
||||
, success: function(data)
|
||||
{
|
||||
alert(data.resultMsg);
|
||||
if(data.resultCd == "0")
|
||||
{
|
||||
// 재기동 없이 즉시 반영 — 캐시 무력화 위해 타임스탬프 부여
|
||||
var ts = new Date().getTime();
|
||||
if(kind == 'logo') $('#previewLogo').attr('src', '<c:url value="/branding/logo"/>?t=' + ts);
|
||||
if(kind == 'favicon') $('#previewFavicon').attr('src', '<c:url value="/branding/favicon"/>?t=' + ts);
|
||||
}
|
||||
}
|
||||
, error: function(e)
|
||||
{
|
||||
alert("업로드 중 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
|
||||
console.log(JSON.stringify(e));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<div class="body_wrap">
|
||||
|
||||
<!-- main title -->
|
||||
<div class="main_titWrap">
|
||||
<h3>로고 / 파비콘 관리</h3>
|
||||
<div class="location">
|
||||
<div class="location-cont">
|
||||
<div>
|
||||
<ul class="route_navi">
|
||||
<li><a href="#" title="홈"><span class="home">홈</span></a></li>
|
||||
<li><a href="#" title="시스템관리">시스템관리</a></li>
|
||||
<li>로고/파비콘 관리</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!--//main title -->
|
||||
|
||||
<div class="bbs_view">
|
||||
<table class="tbl_form">
|
||||
<caption>로고/파비콘 관리</caption>
|
||||
<colgroup>
|
||||
<col style="width: 15%;">
|
||||
<col style="width: 35%">
|
||||
<col style="width: 20%">
|
||||
<col style="width: 30%;">
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th> 로고 </th>
|
||||
<td>
|
||||
<img id="previewLogo" src="<c:url value='/branding/logo'/>" alt="로고 미리보기" style="max-height:40px; background:#fff; padding:4px; border:1px solid #eee;">
|
||||
</td>
|
||||
<th> 로고 파일 </th>
|
||||
<td>
|
||||
<input type="file" id="logoFile" accept=".svg,.png,.jpg,.jpeg,.gif">
|
||||
<button type="button" class="btn-etc" onclick="fncUpload('logo'); return false;">변경</button>
|
||||
<div style="color:#888; font-size:12px;">허용: svg/png/jpg/gif, 2MB 이하</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th> 파비콘 </th>
|
||||
<td>
|
||||
<img id="previewFavicon" src="<c:url value='/branding/favicon'/>" alt="파비콘 미리보기" style="max-height:32px; background:#fff; padding:4px; border:1px solid #eee;">
|
||||
</td>
|
||||
<th> 파비콘 파일 </th>
|
||||
<td>
|
||||
<input type="file" id="faviconFile" accept=".ico,.png,.svg,.jpg,.jpeg,.gif">
|
||||
<button type="button" class="btn-etc" onclick="fncUpload('favicon'); return false;">변경</button>
|
||||
<div style="color:#888; font-size:12px;">허용: ico/png/svg/jpg/gif, 2MB 이하</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p style="color:#888; margin-top:10px;">※ 변경 시 재기동 없이 즉시 반영됩니다. 업로드본이 없으면 KIC 기본 로고/파비콘이 표시됩니다.</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@ -327,12 +327,6 @@
|
||||
<spring:message code="button.delete" />
|
||||
</button>
|
||||
</c:if>
|
||||
<%-- 2026.07.19 기능개선09/F09 : 관리자는 타인 게시물도 삭제 가능 --%>
|
||||
<c:if test="${result.frstRegisterId != sessionUniqId && sessionAdminYn == 'Y'}">
|
||||
<button type="button" class="btn-etc" onclick="fn_egov_delete_notice(); return false;" title="<spring:message code="button.delete" />">
|
||||
<spring:message code="button.delete" />
|
||||
</button>
|
||||
</c:if>
|
||||
|
||||
<%-- 2025.04.01 나혁제 댓글형태 변경
|
||||
<c:if test="${result.replyPosblAt == 'Y'}">
|
||||
@ -396,8 +390,7 @@
|
||||
<strong style='font-weight: bold; margin-right: 20px;'> ${listCn.wrterNm} </strong>
|
||||
<span> ${listCn.frstRegisterPnttm} </span>
|
||||
<div align='right' style='display: inline-table; float: right;'>
|
||||
<%-- 2026.07.19 기능개선09/F09 : 작성자 또는 관리자면 댓글 삭제 가능 --%>
|
||||
<c:if test="${listCn.deleteYn eq 'Y' || sessionAdminYn == 'Y' }">
|
||||
<c:if test="${listCn.deleteYn eq 'Y' }">
|
||||
<a href="javascript:fn_egov_deleteCommentList('${listCn.commentNo}', '${result.bbsId}', '${result.nttId}')" >
|
||||
<spring:message code="button.delete" />
|
||||
</a>
|
||||
|
||||
@ -1,349 +1,347 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
|
||||
<%
|
||||
/**
|
||||
* @ Class Name : NoticeList.jsp
|
||||
* @ Description : 게시물 목록화면
|
||||
* @ Modification Information
|
||||
* @
|
||||
* @ 수정일 수정자 수정내용
|
||||
* @ ------- -------- ---------------------------
|
||||
* @ 2025.01.20 나혁제 최초 생성
|
||||
*
|
||||
* @ author urp 인프라본부 나혁제
|
||||
* @ since 2025.01.20
|
||||
* @ version 1.0
|
||||
* @ see
|
||||
*
|
||||
*/
|
||||
%>
|
||||
|
||||
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
|
||||
<%-- <%@ page import="egovframework.com.cmm.service.EgovProperties" %> --%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
|
||||
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
|
||||
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
|
||||
|
||||
<c:set var="ImgUrl" value="/egov/images/egovframework/com/cop/bbs"/>
|
||||
|
||||
<title><c:out value="${brdMstrVO.bbsNm}" />관리</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
|
||||
<link href="<c:url value="/egov/css/com/button.css"/>" rel="stylesheet" type="text/css">
|
||||
|
||||
<c:if test="${anonymous == 'true'}">
|
||||
<c:set var="prefix" value="/anonymous"/>
|
||||
</c:if>
|
||||
|
||||
<script type="text/javascript" src="<c:url value='/egov/js/EgovBBSMng.js' />" ></script>
|
||||
|
||||
<c:choose>
|
||||
<c:when test="${preview == 'true'}">
|
||||
<script type="text/javascript">
|
||||
<!--
|
||||
function press(event) {
|
||||
}
|
||||
|
||||
function fn_egov_addNotice() {
|
||||
}
|
||||
|
||||
function fn_egov_select_noticeList(pageNo) {
|
||||
}
|
||||
|
||||
function fn_egov_inqire_notice(nttId, bbsId) {
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</c:when>
|
||||
|
||||
<c:otherwise>
|
||||
<script type="text/javascript">
|
||||
function press(event)
|
||||
{
|
||||
if (event.keyCode==13)
|
||||
{
|
||||
fn_egov_select_noticeList('1');
|
||||
}
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 게시글 등록 페이지 이동 처리
|
||||
******************************************************** */
|
||||
function fn_egov_addNotice()
|
||||
{
|
||||
document.frm.action = "<c:url value='/bbs${prefix}/admin/addBoardArticle.do'/>";
|
||||
document.frm.submit();
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 게시글 페이징 처리
|
||||
******************************************************** */
|
||||
function fn_egov_select_noticeList(pageNo)
|
||||
{
|
||||
document.frm.pageIndex.value = pageNo;
|
||||
document.frm.action = "<c:url value='/bbs${prefix}/admin/selectBoardList.do'/>";
|
||||
document.frm.submit();
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 게시글 상세조회 처리
|
||||
********************************* */
|
||||
function fn_egov_inqire_notice(nttId, bbsId)
|
||||
{
|
||||
document.frm.nttId.value = nttId;
|
||||
document.frm.bbsId.value = bbsId;
|
||||
document.frm.action = "<c:url value='/bbs${prefix}/admin/selectBoardArticle.do'/>";
|
||||
document.frm.submit();
|
||||
}
|
||||
</script>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
|
||||
<noscript class="noScriptTitle"><spring:message code="common.noScriptTitle.msg" /></noscript>
|
||||
|
||||
<form name="frm" action="<c:url value='/bbs${prefix}/admin/selectBoardList.do'/>" method="post">
|
||||
|
||||
<input type="hidden" name="bbsId" value="<c:out value='${boardVO.bbsId}'/>" />
|
||||
<input type="hidden" name="bbsNm" value="<c:out value='${brdMstrVO.bbsNm}'/>" />
|
||||
<input type="hidden" name="nttId" value="0" />
|
||||
<input type="hidden" name="bbsTyCode" value="<c:out value='${brdMstrVO.bbsTyCode}'/>" />
|
||||
<input type="hidden" name="bbsAttrbCode" value="<c:out value='${brdMstrVO.bbsAttrbCode}'/>" />
|
||||
<input type="hidden" name="authFlag" value="<c:out value='${brdMstrVO.authFlag}'/>" />
|
||||
<input type="hidden" name="pageIndex" value="<c:out value='${searchVO.pageIndex}'/>" />
|
||||
|
||||
<div class="body_wrap">
|
||||
|
||||
<%-- 2025.01.20 나혁제 신화면 적용
|
||||
<div class="content">
|
||||
|
||||
<div id="navTitle">
|
||||
</div>
|
||||
|
||||
<h4><c:out value="${brdMstrVO.bbsNm}" /> 관리</h4>
|
||||
--%>
|
||||
|
||||
<div id="navTitle"></div>
|
||||
|
||||
<!-- 검색 :s -->
|
||||
<div class="searchArea single-row">
|
||||
<table>
|
||||
<colgroup>
|
||||
<col width="30%">
|
||||
<col width="70%">
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th style="text-align: right;" ><label>검색유형</label></th>
|
||||
<td>
|
||||
<select name="searchCnd" id="searchCnd" title="검색조건 선택" style="width: 200px;" >
|
||||
<option value="0" <c:if test="${searchVO.searchCnd == '0'}">selected="selected"</c:if>>제목</option>
|
||||
<option value="1" <c:if test="${searchVO.searchCnd == '1'}">selected="selected"</c:if>>내용</option>
|
||||
<option value="2" <c:if test="${searchVO.searchCnd == '2'}">selected="selected"</c:if>>작성자</option>
|
||||
</select>
|
||||
|
||||
<input class="s_input" name="searchWrd" type="text" value='<c:out value="${searchVO.searchWrd}" />' style="width: 300px;" maxlength="35" onkeypress="press(event);" title="검색값입력" />
|
||||
|
||||
<div class="btnArea" style="padding-right: 80px;" >
|
||||
<button type="button" class="btn-search" onclick="fn_egov_select_noticeList('1'); return false;" title="<spring:message code="button.inquire" />">
|
||||
<spring:message code="button.inquire" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<!--//검색 :e -->
|
||||
|
||||
|
||||
<%-- 2025.01.20 나혁제 신화면적용
|
||||
<!-- 검색 :start -->
|
||||
<fieldset>
|
||||
<div class="search_wrap">
|
||||
<div class="form_group">
|
||||
|
||||
<select name="searchCnd" id="searchCnd" title="검색조건 선택">
|
||||
<option value="0" <c:if test="${searchVO.searchCnd == '0'}">selected="selected"</c:if>>제목</option>
|
||||
<option value="1" <c:if test="${searchVO.searchCnd == '1'}">selected="selected"</c:if>>내용</option>
|
||||
<option value="2" <c:if test="${searchVO.searchCnd == '2'}">selected="selected"</c:if>>작성자</option>
|
||||
</select>
|
||||
|
||||
<input class="s_input2 vat" name="searchWrd" type="text" value='<c:out value="${searchVO.searchWrd}"/>' maxlength="35" onkeypress="press(event);" title="검색어 입력" />
|
||||
|
||||
<button type="submit" class="search_btn" onclick="fn_egov_select_noticeList('1'); return false;"><spring:message code="title.inquire" /><!-- 조회 -->
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
<!--//검색 :end -->
|
||||
--%>
|
||||
|
||||
<!-- 게시판 -->
|
||||
<div class="tbl_list" >
|
||||
<table class="table" summary="번호, 제목, 게시시작일, 게시종료일, 작성자, 작성일, 조회수 입니다">
|
||||
|
||||
<caption>게시물 목록</caption>
|
||||
|
||||
<colgroup>
|
||||
<col style="width: 80px;">
|
||||
<col style="width: auto;">
|
||||
<c:if test="${brdMstrVO.bbsAttrbCode == 'BBSA01'}">
|
||||
<col style="width: 80;">
|
||||
<col style="width: 80;">
|
||||
</c:if>
|
||||
<c:if test="${anonymous != 'true'}">
|
||||
<col style="width: 100px;">
|
||||
</c:if>
|
||||
<col style="width: 120px;">
|
||||
<col style="width: 100px;">
|
||||
</colgroup>
|
||||
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">번호</th>
|
||||
<th scope="col">제목</th>
|
||||
<c:if test="${brdMstrVO.bbsAttrbCode == 'BBSA01'}">
|
||||
<th scope="col">게시시작일</th>
|
||||
<th scope="col">게시종료일</th>
|
||||
</c:if>
|
||||
<c:if test="${anonymous != 'true'}">
|
||||
<th scope="col">작성자</th>
|
||||
</c:if>
|
||||
<th scope="col">작성일</th>
|
||||
<th scope="col">조회수</th>
|
||||
<th scope="col">댓글수</th><!-- 2026.07.19 기능개선10/F10 : 댓글수 표기 -->
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
<c:if test="${fn:length(resultList) == 0}">
|
||||
<tr>
|
||||
<c:choose>
|
||||
<c:when test="${brdMstrVO.bbsAttrbCode == 'BBSA01'}">
|
||||
<td colspan="8"><spring:message code="common.nodata.msg" /></td>
|
||||
</c:when>
|
||||
|
||||
<c:otherwise>
|
||||
<c:choose>
|
||||
<c:when test="${anonymous == 'true'}">
|
||||
<td colspan="5"><spring:message code="common.nodata.msg" /></td>
|
||||
</c:when>
|
||||
|
||||
<c:otherwise>
|
||||
<td colspan="6"><spring:message code="common.nodata.msg" /></td>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</tr>
|
||||
</c:if>
|
||||
|
||||
<c:forEach var="result" items="${resultList}" varStatus="status">
|
||||
<tr>
|
||||
<td><c:out value="${paginationInfo.totalRecordCount+1 - ((searchVO.pageIndex-1) * searchVO.pageSize + status.count)}" /></td>
|
||||
<td class="left" style="text-align: left;" >
|
||||
<%-- <form name="subForm" method="post" action="<c:url value='/bbs${prefix}/admin/selectBoardArticle.do'/>"> --%>
|
||||
<c:if test="${result.replyLc!=0}">
|
||||
<c:forEach begin="0" end="${result.replyLc}" step="1">
|
||||
|
||||
</c:forEach>
|
||||
|
||||
<img src="<c:url value='/'/>egov/images/ico_reply.png" alt="reply arrow">
|
||||
</c:if>
|
||||
|
||||
<c:choose>
|
||||
<c:when test="${result.isExpired=='Y' || result.useAt == 'N'}">
|
||||
<c:out value="${result.nttSj}" />
|
||||
</c:when>
|
||||
|
||||
<c:otherwise>
|
||||
<%--
|
||||
<input type="hidden" name="bbsId" value="<c:out value='${result.bbsId}'/>" />
|
||||
<input type="hidden" name="nttId" value="<c:out value="${result.nttId}"/>" />
|
||||
<input type="hidden" name="bbsTyCode" value="<c:out value='${brdMstrVO.bbsTyCode}'/>" />
|
||||
<input type="hidden" name="bbsAttrbCode" value="<c:out value='${brdMstrVO.bbsAttrbCode}'/>" />
|
||||
<input type="hidden" name="authFlag" value="<c:out value='${brdMstrVO.authFlag}'/>" />
|
||||
<input type="hidden" name="pageIndex" value="<c:out value='${searchVO.pageIndex}'/>" />
|
||||
--%>
|
||||
|
||||
<a href="javascript:;" style="display:contents;" class="lnk" onclick="fn_egov_inqire_notice('<c:out value="${result.nttId}"/>', '<c:out value="${boardVO.bbsId}"/>'); return false;"><c:out value="${result.nttSj}" /></a>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
<!-- </form> -->
|
||||
</td>
|
||||
|
||||
<c:if test="${brdMstrVO.bbsAttrbCode == 'BBSA01'}">
|
||||
<td><c:out value="${result.ntceBgnde}" /></td>
|
||||
<td><c:out value="${result.ntceEndde}" /></td>
|
||||
</c:if>
|
||||
|
||||
<c:if test="${anonymous != 'true'}">
|
||||
<td><c:out value="${result.frstRegisterNm}" /></td>
|
||||
</c:if>
|
||||
|
||||
<td><c:out value="${result.frstRegisterPnttm}" /></td>
|
||||
<td><c:out value="${result.inqireCo}" /></td>
|
||||
<td><c:out value="${result.cmntCnt}" /></td><!-- 2026.07.19 기능개선10/F10 : 댓글수 -->
|
||||
</tr>
|
||||
</c:forEach>
|
||||
</tbody>
|
||||
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<!--// 게시판 -->
|
||||
|
||||
<!-- 페이지 네비게이션 시작 -->
|
||||
<div class="pagination">
|
||||
<ul>
|
||||
<ui:pagination paginationInfo="${paginationInfo}" type="image" jsFunction="fn_egov_select_noticeList"/>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- // 페이지 네비게이션 끝 -->
|
||||
|
||||
<!-- main btn : start -->
|
||||
<div class="btn_group">
|
||||
<!-- 왼쪽영역-->
|
||||
<div style="text-align: left;position: absolute;">
|
||||
<c:if test="${brdMstrVO.blogAt == 'Y'}">
|
||||
<button type="button" class="btn-function" title="블로그" onclick="location.href = '<c:url value='/bbs/selectArticleBlogList.do'/>?blogId=<c:out value="${brdMstrVO.blogId}"/>'">블로그</button>
|
||||
</c:if>
|
||||
</div>
|
||||
<!--//왼쪽영역-->
|
||||
|
||||
<div>
|
||||
<button type="button" class="btn-function" title="등록" onclick="fn_egov_addNotice(); return false;" >
|
||||
<spring:message code="button.create" /> <!-- 등록 -->
|
||||
</button>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- main btn : end -->
|
||||
|
||||
|
||||
<%-- 2025.01.20 나혁제 신디자인 적용
|
||||
<!-- 하단 버튼 : start -->
|
||||
<div class="btn-Area">
|
||||
<!-- 왼쪽영역-->
|
||||
<div>
|
||||
<c:if test="${brdMstrVO.blogAt == 'Y'}">
|
||||
<button type="button" class="btn-normal" title="블로그" onclick="location.href = '<c:url value='/bbs/selectArticleBlogList.do'/>?blogId=<c:out value="${brdMstrVO.blogId}"/>'">블로그</button>
|
||||
</c:if>
|
||||
</div>
|
||||
<!--//왼쪽영역-->
|
||||
<!-- 오른쪽영역-->
|
||||
<div>
|
||||
<button type="button" class="btn-primary" title="등록" onclick="fn_egov_addNotice(); return false;"/><spring:message code="button.create"/></button><!-- 등록 -->
|
||||
</div>
|
||||
<!--//오른쪽영역-->
|
||||
</div>
|
||||
<!-- 하단 버튼 : end -->
|
||||
--%>
|
||||
|
||||
<%-- 2025.01.20 나혁제 신화면적용
|
||||
</div>
|
||||
--%>
|
||||
</div>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
|
||||
<%
|
||||
/**
|
||||
* @ Class Name : NoticeList.jsp
|
||||
* @ Description : 게시물 목록화면
|
||||
* @ Modification Information
|
||||
* @
|
||||
* @ 수정일 수정자 수정내용
|
||||
* @ ------- -------- ---------------------------
|
||||
* @ 2025.01.20 나혁제 최초 생성
|
||||
*
|
||||
* @ author urp 인프라본부 나혁제
|
||||
* @ since 2025.01.20
|
||||
* @ version 1.0
|
||||
* @ see
|
||||
*
|
||||
*/
|
||||
%>
|
||||
|
||||
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
|
||||
<%-- <%@ page import="egovframework.com.cmm.service.EgovProperties" %> --%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
|
||||
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
|
||||
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
|
||||
|
||||
<c:set var="ImgUrl" value="/egov/images/egovframework/com/cop/bbs"/>
|
||||
|
||||
<title><c:out value="${brdMstrVO.bbsNm}" />관리</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
|
||||
<link href="<c:url value="/egov/css/com/button.css"/>" rel="stylesheet" type="text/css">
|
||||
|
||||
<c:if test="${anonymous == 'true'}">
|
||||
<c:set var="prefix" value="/anonymous"/>
|
||||
</c:if>
|
||||
|
||||
<script type="text/javascript" src="<c:url value='/egov/js/EgovBBSMng.js' />" ></script>
|
||||
|
||||
<c:choose>
|
||||
<c:when test="${preview == 'true'}">
|
||||
<script type="text/javascript">
|
||||
<!--
|
||||
function press(event) {
|
||||
}
|
||||
|
||||
function fn_egov_addNotice() {
|
||||
}
|
||||
|
||||
function fn_egov_select_noticeList(pageNo) {
|
||||
}
|
||||
|
||||
function fn_egov_inqire_notice(nttId, bbsId) {
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</c:when>
|
||||
|
||||
<c:otherwise>
|
||||
<script type="text/javascript">
|
||||
function press(event)
|
||||
{
|
||||
if (event.keyCode==13)
|
||||
{
|
||||
fn_egov_select_noticeList('1');
|
||||
}
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 게시글 등록 페이지 이동 처리
|
||||
******************************************************** */
|
||||
function fn_egov_addNotice()
|
||||
{
|
||||
document.frm.action = "<c:url value='/bbs${prefix}/admin/addBoardArticle.do'/>";
|
||||
document.frm.submit();
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 게시글 페이징 처리
|
||||
******************************************************** */
|
||||
function fn_egov_select_noticeList(pageNo)
|
||||
{
|
||||
document.frm.pageIndex.value = pageNo;
|
||||
document.frm.action = "<c:url value='/bbs${prefix}/admin/selectBoardList.do'/>";
|
||||
document.frm.submit();
|
||||
}
|
||||
|
||||
/* ********************************************************
|
||||
* 게시글 상세조회 처리
|
||||
********************************* */
|
||||
function fn_egov_inqire_notice(nttId, bbsId)
|
||||
{
|
||||
document.frm.nttId.value = nttId;
|
||||
document.frm.bbsId.value = bbsId;
|
||||
document.frm.action = "<c:url value='/bbs${prefix}/admin/selectBoardArticle.do'/>";
|
||||
document.frm.submit();
|
||||
}
|
||||
</script>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
|
||||
<noscript class="noScriptTitle"><spring:message code="common.noScriptTitle.msg" /></noscript>
|
||||
|
||||
<form name="frm" action="<c:url value='/bbs${prefix}/admin/selectBoardList.do'/>" method="post">
|
||||
|
||||
<input type="hidden" name="bbsId" value="<c:out value='${boardVO.bbsId}'/>" />
|
||||
<input type="hidden" name="bbsNm" value="<c:out value='${brdMstrVO.bbsNm}'/>" />
|
||||
<input type="hidden" name="nttId" value="0" />
|
||||
<input type="hidden" name="bbsTyCode" value="<c:out value='${brdMstrVO.bbsTyCode}'/>" />
|
||||
<input type="hidden" name="bbsAttrbCode" value="<c:out value='${brdMstrVO.bbsAttrbCode}'/>" />
|
||||
<input type="hidden" name="authFlag" value="<c:out value='${brdMstrVO.authFlag}'/>" />
|
||||
<input type="hidden" name="pageIndex" value="<c:out value='${searchVO.pageIndex}'/>" />
|
||||
|
||||
<div class="body_wrap">
|
||||
|
||||
<%-- 2025.01.20 나혁제 신화면 적용
|
||||
<div class="content">
|
||||
|
||||
<div id="navTitle">
|
||||
</div>
|
||||
|
||||
<h4><c:out value="${brdMstrVO.bbsNm}" /> 관리</h4>
|
||||
--%>
|
||||
|
||||
<div id="navTitle"></div>
|
||||
|
||||
<!-- 검색 :s -->
|
||||
<div class="searchArea single-row">
|
||||
<table>
|
||||
<colgroup>
|
||||
<col width="30%">
|
||||
<col width="70%">
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th style="text-align: right;" ><label>검색유형</label></th>
|
||||
<td>
|
||||
<select name="searchCnd" id="searchCnd" title="검색조건 선택" style="width: 200px;" >
|
||||
<option value="0" <c:if test="${searchVO.searchCnd == '0'}">selected="selected"</c:if>>제목</option>
|
||||
<option value="1" <c:if test="${searchVO.searchCnd == '1'}">selected="selected"</c:if>>내용</option>
|
||||
<option value="2" <c:if test="${searchVO.searchCnd == '2'}">selected="selected"</c:if>>작성자</option>
|
||||
</select>
|
||||
|
||||
<input class="s_input" name="searchWrd" type="text" value='<c:out value="${searchVO.searchWrd}" />' style="width: 300px;" maxlength="35" onkeypress="press(event);" title="검색값입력" />
|
||||
|
||||
<div class="btnArea" style="padding-right: 80px;" >
|
||||
<button type="button" class="btn-search" onclick="fn_egov_select_noticeList('1'); return false;" title="<spring:message code="button.inquire" />">
|
||||
<spring:message code="button.inquire" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<!--//검색 :e -->
|
||||
|
||||
|
||||
<%-- 2025.01.20 나혁제 신화면적용
|
||||
<!-- 검색 :start -->
|
||||
<fieldset>
|
||||
<div class="search_wrap">
|
||||
<div class="form_group">
|
||||
|
||||
<select name="searchCnd" id="searchCnd" title="검색조건 선택">
|
||||
<option value="0" <c:if test="${searchVO.searchCnd == '0'}">selected="selected"</c:if>>제목</option>
|
||||
<option value="1" <c:if test="${searchVO.searchCnd == '1'}">selected="selected"</c:if>>내용</option>
|
||||
<option value="2" <c:if test="${searchVO.searchCnd == '2'}">selected="selected"</c:if>>작성자</option>
|
||||
</select>
|
||||
|
||||
<input class="s_input2 vat" name="searchWrd" type="text" value='<c:out value="${searchVO.searchWrd}"/>' maxlength="35" onkeypress="press(event);" title="검색어 입력" />
|
||||
|
||||
<button type="submit" class="search_btn" onclick="fn_egov_select_noticeList('1'); return false;"><spring:message code="title.inquire" /><!-- 조회 -->
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
<!--//검색 :end -->
|
||||
--%>
|
||||
|
||||
<!-- 게시판 -->
|
||||
<div class="tbl_list" >
|
||||
<table class="table" summary="번호, 제목, 게시시작일, 게시종료일, 작성자, 작성일, 조회수 입니다">
|
||||
|
||||
<caption>게시물 목록</caption>
|
||||
|
||||
<colgroup>
|
||||
<col style="width: 80px;">
|
||||
<col style="width: auto;">
|
||||
<c:if test="${brdMstrVO.bbsAttrbCode == 'BBSA01'}">
|
||||
<col style="width: 80;">
|
||||
<col style="width: 80;">
|
||||
</c:if>
|
||||
<c:if test="${anonymous != 'true'}">
|
||||
<col style="width: 100px;">
|
||||
</c:if>
|
||||
<col style="width: 120px;">
|
||||
<col style="width: 100px;">
|
||||
</colgroup>
|
||||
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">번호</th>
|
||||
<th scope="col">제목</th>
|
||||
<c:if test="${brdMstrVO.bbsAttrbCode == 'BBSA01'}">
|
||||
<th scope="col">게시시작일</th>
|
||||
<th scope="col">게시종료일</th>
|
||||
</c:if>
|
||||
<c:if test="${anonymous != 'true'}">
|
||||
<th scope="col">작성자</th>
|
||||
</c:if>
|
||||
<th scope="col">작성일</th>
|
||||
<th scope="col">조회수</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
<c:if test="${fn:length(resultList) == 0}">
|
||||
<tr>
|
||||
<c:choose>
|
||||
<c:when test="${brdMstrVO.bbsAttrbCode == 'BBSA01'}">
|
||||
<td colspan="7"><spring:message code="common.nodata.msg" /></td>
|
||||
</c:when>
|
||||
|
||||
<c:otherwise>
|
||||
<c:choose>
|
||||
<c:when test="${anonymous == 'true'}">
|
||||
<td colspan="4"><spring:message code="common.nodata.msg" /></td>
|
||||
</c:when>
|
||||
|
||||
<c:otherwise>
|
||||
<td colspan="5"><spring:message code="common.nodata.msg" /></td>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</tr>
|
||||
</c:if>
|
||||
|
||||
<c:forEach var="result" items="${resultList}" varStatus="status">
|
||||
<tr>
|
||||
<td><c:out value="${paginationInfo.totalRecordCount+1 - ((searchVO.pageIndex-1) * searchVO.pageSize + status.count)}" /></td>
|
||||
<td class="left" style="text-align: left;" >
|
||||
<%-- <form name="subForm" method="post" action="<c:url value='/bbs${prefix}/admin/selectBoardArticle.do'/>"> --%>
|
||||
<c:if test="${result.replyLc!=0}">
|
||||
<c:forEach begin="0" end="${result.replyLc}" step="1">
|
||||
|
||||
</c:forEach>
|
||||
|
||||
<img src="<c:url value='/'/>egov/images/ico_reply.png" alt="reply arrow">
|
||||
</c:if>
|
||||
|
||||
<c:choose>
|
||||
<c:when test="${result.isExpired=='Y' || result.useAt == 'N'}">
|
||||
<c:out value="${result.nttSj}" />
|
||||
</c:when>
|
||||
|
||||
<c:otherwise>
|
||||
<%--
|
||||
<input type="hidden" name="bbsId" value="<c:out value='${result.bbsId}'/>" />
|
||||
<input type="hidden" name="nttId" value="<c:out value="${result.nttId}"/>" />
|
||||
<input type="hidden" name="bbsTyCode" value="<c:out value='${brdMstrVO.bbsTyCode}'/>" />
|
||||
<input type="hidden" name="bbsAttrbCode" value="<c:out value='${brdMstrVO.bbsAttrbCode}'/>" />
|
||||
<input type="hidden" name="authFlag" value="<c:out value='${brdMstrVO.authFlag}'/>" />
|
||||
<input type="hidden" name="pageIndex" value="<c:out value='${searchVO.pageIndex}'/>" />
|
||||
--%>
|
||||
|
||||
<a href="javascript:;" style="display:contents;" class="lnk" onclick="fn_egov_inqire_notice('<c:out value="${result.nttId}"/>', '<c:out value="${boardVO.bbsId}"/>'); return false;"><c:out value="${result.nttSj}" /></a>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
<!-- </form> -->
|
||||
</td>
|
||||
|
||||
<c:if test="${brdMstrVO.bbsAttrbCode == 'BBSA01'}">
|
||||
<td><c:out value="${result.ntceBgnde}" /></td>
|
||||
<td><c:out value="${result.ntceEndde}" /></td>
|
||||
</c:if>
|
||||
|
||||
<c:if test="${anonymous != 'true'}">
|
||||
<td><c:out value="${result.frstRegisterNm}" /></td>
|
||||
</c:if>
|
||||
|
||||
<td><c:out value="${result.frstRegisterPnttm}" /></td>
|
||||
<td><c:out value="${result.inqireCo}" /></td>
|
||||
</tr>
|
||||
</c:forEach>
|
||||
</tbody>
|
||||
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<!--// 게시판 -->
|
||||
|
||||
<!-- 페이지 네비게이션 시작 -->
|
||||
<div class="pagination">
|
||||
<ul>
|
||||
<ui:pagination paginationInfo="${paginationInfo}" type="image" jsFunction="fn_egov_select_noticeList"/>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- // 페이지 네비게이션 끝 -->
|
||||
|
||||
<!-- main btn : start -->
|
||||
<div class="btn_group">
|
||||
<!-- 왼쪽영역-->
|
||||
<div style="text-align: left;position: absolute;">
|
||||
<c:if test="${brdMstrVO.blogAt == 'Y'}">
|
||||
<button type="button" class="btn-function" title="블로그" onclick="location.href = '<c:url value='/bbs/selectArticleBlogList.do'/>?blogId=<c:out value="${brdMstrVO.blogId}"/>'">블로그</button>
|
||||
</c:if>
|
||||
</div>
|
||||
<!--//왼쪽영역-->
|
||||
|
||||
<div>
|
||||
<button type="button" class="btn-function" title="등록" onclick="fn_egov_addNotice(); return false;" >
|
||||
<spring:message code="button.create" /> <!-- 등록 -->
|
||||
</button>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- main btn : end -->
|
||||
|
||||
|
||||
<%-- 2025.01.20 나혁제 신디자인 적용
|
||||
<!-- 하단 버튼 : start -->
|
||||
<div class="btn-Area">
|
||||
<!-- 왼쪽영역-->
|
||||
<div>
|
||||
<c:if test="${brdMstrVO.blogAt == 'Y'}">
|
||||
<button type="button" class="btn-normal" title="블로그" onclick="location.href = '<c:url value='/bbs/selectArticleBlogList.do'/>?blogId=<c:out value="${brdMstrVO.blogId}"/>'">블로그</button>
|
||||
</c:if>
|
||||
</div>
|
||||
<!--//왼쪽영역-->
|
||||
<!-- 오른쪽영역-->
|
||||
<div>
|
||||
<button type="button" class="btn-primary" title="등록" onclick="fn_egov_addNotice(); return false;"/><spring:message code="button.create"/></button><!-- 등록 -->
|
||||
</div>
|
||||
<!--//오른쪽영역-->
|
||||
</div>
|
||||
<!-- 하단 버튼 : end -->
|
||||
--%>
|
||||
|
||||
<%-- 2025.01.20 나혁제 신화면적용
|
||||
</div>
|
||||
--%>
|
||||
</div>
|
||||
</form>
|
||||
@ -54,7 +54,7 @@
|
||||
해당 사용자는 현재 업무에 대해 처리권한이 없습니다.
|
||||
<span class="error_message">
|
||||
서비스 이용에 불편을 드려 죄송합니다.<br>
|
||||
시스템 관리자에게 업무권한 부여후 사용하시길 바랍니다.
|
||||
시스템 관리자에게 없무권한 부여후 사용하시길 바랍니다.
|
||||
</span>
|
||||
</h4>
|
||||
</li>
|
||||
|
||||
@ -1,87 +1,87 @@
|
||||
<!DOCTYPE html>
|
||||
<%
|
||||
/**
|
||||
* @Class Name : MyTodoPortlet.jsp
|
||||
* @Description : TO_DO 포틀릿
|
||||
* @Modification Information
|
||||
* @
|
||||
* @ 수정일 수정자 수정내용
|
||||
* @ ------- -------- ---------------------------
|
||||
* @ 2025.03.10 나혁제 최초 생성
|
||||
*
|
||||
* @author urp 인프라본부 나혁제
|
||||
* @since 2025.03.10
|
||||
* @version 1.0
|
||||
* @see
|
||||
*
|
||||
*/
|
||||
%>
|
||||
<%@ page contentType="text/html; charset=utf-8"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
|
||||
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
|
||||
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
|
||||
|
||||
<script type="text/javaScript" language="javascript" defer="defer">
|
||||
|
||||
//----------------------------------------
|
||||
// 상세조회 페이지 이동처리
|
||||
// ----------------------------------------
|
||||
function DataDetailTodo(strInType, strId, strTask)
|
||||
{
|
||||
var strMenu = "";
|
||||
|
||||
// 보고서
|
||||
if(strInType == '1')
|
||||
{
|
||||
strMenu = "&baseMenuNo=3000000&leftMenuNo=3010000";
|
||||
|
||||
// 점검보고서
|
||||
if(strTask == '1')
|
||||
{
|
||||
$(location).attr("href", "/srm/getReportWithBodyCheck.do?inReportSeq="+strId+strMenu);
|
||||
}
|
||||
// 장애보고서
|
||||
else if(strTask == '2')
|
||||
{
|
||||
$(location).attr("href", "/srm/getReportWithBodyError.do?inReportSeq="+strId+strMenu);
|
||||
}
|
||||
// 이슈보고서
|
||||
else if(strTask == '3')
|
||||
{
|
||||
$(location).attr("href", "/srm/getReportWithBodyIssue.do?inReportSeq="+strId+strMenu);
|
||||
}
|
||||
}
|
||||
// 서비스
|
||||
else if(strInType == '2')
|
||||
{
|
||||
strMenu = "&baseMenuNo=3000000&leftMenuNo=3010000";
|
||||
|
||||
$(location).attr("href", "/srm/getIncidentBySeq.do?inIncidentSeq="+strId+strMenu);
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<div class="week_news" style="width:${potlWidth}px; height:${potlHeight}px;">
|
||||
<h1>TO-DO 현황<a href="javascript:goAddPortletPage('3000000', '3010100');" class="btn_more" title="오늘의 할일 더보기">더보기</a>
|
||||
<div class="delBtn" style="position:relative; z-index:501;" onclick="DelBtn('${potlId}')"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" class="bi bi-trash3" viewBox="0 0 16 16">
|
||||
<path d="M6.5 1h3a.5.5 0 0 1 .5.5v1H6v-1a.5.5 0 0 1 .5-.5ZM11 2.5v-1A1.5 1.5 0 0 0 9.5 0h-3A1.5 1.5 0 0 0 5 1.5v1H2.506a.58.58 0 0 0-.01 0H1.5a.5.5 0 0 0 0 1h.538l.853 10.66A2 2 0 0 0 4.885 16h6.23a2 2 0 0 0 1.994-1.84l.853-10.66h.538a.5.5 0 0 0 0-1h-.995a.59.59 0 0 0-.01 0H11Zm1.958 1-.846 10.58a1 1 0 0 1-.997.92h-6.23a1 1 0 0 1-.997-.92L3.042 3.5h9.916Zm-7.487 1a.5.5 0 0 1 .528.47l.5 8.5a.5.5 0 0 1-.998.06L5 5.03a.5.5 0 0 1 .47-.53Zm5.058 0a.5.5 0 0 1 .47.53l-.5 8.5a.5.5 0 1 1-.998-.06l.5-8.5a.5.5 0 0 1 .528-.47ZM8 4.5a.5.5 0 0 1 .5.5v8.5a.5.5 0 0 1-1 0V5a.5.5 0 0 1 .5-.5Z"/>
|
||||
</svg>
|
||||
</div>
|
||||
</h1>
|
||||
<ul class="news_list">
|
||||
<c:forEach var="result" items="${resultList}" varStatus="status">
|
||||
<li>
|
||||
<a href="javascript:DataDetailTodo('${result.inType}', '${result.inSeq}','${result.inTask}');">
|
||||
<span class="noti_tit"><c:out value="${result.vcTitle}" /></span>
|
||||
</a>
|
||||
<span class="r_txt">
|
||||
<span class="w_name">${result.vcType}</span>
|
||||
${result.dtRegDatetime}
|
||||
</span>
|
||||
</li>
|
||||
|
||||
</c:forEach>
|
||||
</ul>
|
||||
<!DOCTYPE html>
|
||||
<%
|
||||
/**
|
||||
* @Class Name : MyTodoPortlet.jsp
|
||||
* @Description : TO_DO 포틀릿
|
||||
* @Modification Information
|
||||
* @
|
||||
* @ 수정일 수정자 수정내용
|
||||
* @ ------- -------- ---------------------------
|
||||
* @ 2025.03.10 나혁제 최초 생성
|
||||
*
|
||||
* @author urp 인프라본부 나혁제
|
||||
* @since 2025.03.10
|
||||
* @version 1.0
|
||||
* @see
|
||||
*
|
||||
*/
|
||||
%>
|
||||
<%@ page contentType="text/html; charset=utf-8"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
|
||||
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
|
||||
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
|
||||
|
||||
<script type="text/javaScript" language="javascript" defer="defer">
|
||||
|
||||
//----------------------------------------
|
||||
// 상세조회 페이지 이동처리
|
||||
// ----------------------------------------
|
||||
function DataDetailTodo(strInType, strId, strTask)
|
||||
{
|
||||
var strMenu = "";
|
||||
|
||||
// 보고서
|
||||
if(strInType == '1')
|
||||
{
|
||||
strMenu = "&baseMenuNo=3000000&leftMenuNo=3010000";
|
||||
|
||||
// 점검보고서
|
||||
if(strTask == '1')
|
||||
{
|
||||
$(location).attr("href", "/srm/getReportWithBodyCheck.do?inReportSeq="+strId+strMenu);
|
||||
}
|
||||
// 장애보고서
|
||||
else if(strTask == '2')
|
||||
{
|
||||
$(location).attr("href", "/srm/getReportWithBodyError.do?inReportSeq="+strId+strMenu);
|
||||
}
|
||||
// 이슈보고서
|
||||
else if(strTask == '3')
|
||||
{
|
||||
$(location).attr("href", "/srm/getReportWithBodyIssue.do?inReportSeq="+strId+strMenu);
|
||||
}
|
||||
}
|
||||
// 인스던트
|
||||
else if(strInType == '2')
|
||||
{
|
||||
strMenu = "&baseMenuNo=3000000&leftMenuNo=3010000";
|
||||
|
||||
$(location).attr("href", "/srm/getIncidentBySeq.do?inIncidentSeq="+strId+strMenu);
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<div class="week_news" style="width:${potlWidth}px; height:${potlHeight}px;">
|
||||
<h1>TO-DO 현황<a href="javascript:goAddPortletPage('3000000', '3010100');" class="btn_more" title="오늘의 할일 더보기">더보기</a>
|
||||
<div class="delBtn" style="position:relative; z-index:501;" onclick="DelBtn('${potlId}')"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" class="bi bi-trash3" viewBox="0 0 16 16">
|
||||
<path d="M6.5 1h3a.5.5 0 0 1 .5.5v1H6v-1a.5.5 0 0 1 .5-.5ZM11 2.5v-1A1.5 1.5 0 0 0 9.5 0h-3A1.5 1.5 0 0 0 5 1.5v1H2.506a.58.58 0 0 0-.01 0H1.5a.5.5 0 0 0 0 1h.538l.853 10.66A2 2 0 0 0 4.885 16h6.23a2 2 0 0 0 1.994-1.84l.853-10.66h.538a.5.5 0 0 0 0-1h-.995a.59.59 0 0 0-.01 0H11Zm1.958 1-.846 10.58a1 1 0 0 1-.997.92h-6.23a1 1 0 0 1-.997-.92L3.042 3.5h9.916Zm-7.487 1a.5.5 0 0 1 .528.47l.5 8.5a.5.5 0 0 1-.998.06L5 5.03a.5.5 0 0 1 .47-.53Zm5.058 0a.5.5 0 0 1 .47.53l-.5 8.5a.5.5 0 1 1-.998-.06l.5-8.5a.5.5 0 0 1 .528-.47ZM8 4.5a.5.5 0 0 1 .5.5v8.5a.5.5 0 0 1-1 0V5a.5.5 0 0 1 .5-.5Z"/>
|
||||
</svg>
|
||||
</div>
|
||||
</h1>
|
||||
<ul class="news_list">
|
||||
<c:forEach var="result" items="${resultList}" varStatus="status">
|
||||
<li>
|
||||
<a href="javascript:DataDetailTodo('${result.inType}', '${result.inSeq}','${result.inTask}');">
|
||||
<span class="noti_tit"><c:out value="${result.vcTitle}" /></span>
|
||||
</a>
|
||||
<span class="r_txt">
|
||||
<span class="w_name">${result.vcType}</span>
|
||||
${result.dtRegDatetime}
|
||||
</span>
|
||||
</li>
|
||||
|
||||
</c:forEach>
|
||||
</ul>
|
||||
</div>
|
||||
@ -161,7 +161,7 @@
|
||||
<c:out value="${(searchVO.pageIndex-1) * searchVO.pageSize + status.count}"/>
|
||||
</td>
|
||||
<td><c:out value="${report.inTaskNm}"/></td>
|
||||
<td><a href="javascript:fncSelectReport('${report.inReportForm}')" title="${report.vcFormName}">${report.vcFormName}</a></td>
|
||||
<td><a href="javascript:fncSelectReport('${report.inReportForm}')" style="text-align: center;" >${report.vcFormName}</a></td>
|
||||
<td><c:out value="${report.vcTaskUser}"/></td>
|
||||
<td><c:out value="${report.inSortSn}"/></td>
|
||||
<td><c:out value="${report.vcFormDesc}"/></td>
|
||||
|
||||
@ -1,221 +1,221 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<%
|
||||
/**
|
||||
* @Class Name : SearchOne.jsp
|
||||
* @Description : 개별 검색 처리 화면
|
||||
* @Modification Information
|
||||
* @
|
||||
* @ 수정일 수정자 수정내용
|
||||
* @ ------- -------- ---------------------------
|
||||
* @ 2025.04.25 나혁제 최초 생성
|
||||
*
|
||||
* @author urp 인프라본부 나혁제
|
||||
* @since 2025.04.25
|
||||
* @version 1.0
|
||||
* @see
|
||||
*
|
||||
*/
|
||||
%>
|
||||
|
||||
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
|
||||
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
|
||||
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
|
||||
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
|
||||
|
||||
|
||||
<title>자산분류관리</title>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
|
||||
|
||||
<script type="text/javaScript" language="javascript" defer="defer">
|
||||
|
||||
//----------------------------------------
|
||||
// 화면 초기화
|
||||
// ----------------------------------------
|
||||
$(document).ready(function()
|
||||
{
|
||||
// 결재라인 높이 조정
|
||||
$("em").css("color", "red");
|
||||
$("em").css("font-weight", "bold");
|
||||
});
|
||||
|
||||
//----------------------------------------
|
||||
// 통합검색
|
||||
// ----------------------------------------
|
||||
function fnSearch()
|
||||
{
|
||||
fnLinkPage(1);
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 페이징 처리
|
||||
// ----------------------------------------
|
||||
function fnLinkPage(pageIndex)
|
||||
{
|
||||
document.listForm.pageIndex.value = pageIndex-1;
|
||||
document.listForm.action = "<c:url value='/search/SearchOne.do'/>";
|
||||
document.listForm.method="get";
|
||||
document.listForm.submit();
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 상세조회 페이지 이동처리
|
||||
// ----------------------------------------
|
||||
function DataDetailSearch(strGb, strId, strTask)
|
||||
{
|
||||
var strMenu = "";
|
||||
|
||||
// 서비스
|
||||
if(strGb=="1")
|
||||
{
|
||||
strMenu = "&baseMenuNo=3000000&leftMenuNo=3010000";
|
||||
|
||||
$(location).attr("href", "/srm/getIncidentBySeq.do?inIncidentSeq="+strId+strMenu);
|
||||
}
|
||||
// 보고서
|
||||
else if(strGb=="2")
|
||||
{
|
||||
strMenu = "&baseMenuNo=3000000&leftMenuNo=3010000";
|
||||
|
||||
// 점검보고서
|
||||
if(strTask == 1)
|
||||
{
|
||||
$(location).attr("href", "/srm/getReportWithBodyCheck.do?inReportSeq="+strId+strMenu);
|
||||
}
|
||||
// 장애보고서
|
||||
else if(strTask == 2)
|
||||
{
|
||||
$(location).attr("href", "/srm/getReportWithBodyError.do?inReportSeq="+strId+strMenu);
|
||||
}
|
||||
// 이슈보고서
|
||||
else if(strTask == 3)
|
||||
{
|
||||
$(location).attr("href", "/srm/getReportWithBodyIssue.do?inReportSeq="+strId+strMenu);
|
||||
}
|
||||
// 2025.11.20 나혁제 기타보고서
|
||||
else if(inTask > 3)
|
||||
{
|
||||
$(location).attr("href", "/srm/getReportWithBodyOther.do?inTask="+inTask+"&inReportSeq="+strId+strMenu);
|
||||
}
|
||||
}
|
||||
else if(strGb=="3")
|
||||
{
|
||||
strMenu = "&baseMenuNo=5000000&leftMenuNo=5010000";
|
||||
|
||||
$(location).attr("href", "/bbs/admin/selectBoardArticle.do?bbsId="+bbs_id+"&nttId="+strId+strMenu);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
<!-- javascript warning tag -->
|
||||
<noscript class="noScriptTitle"><spring:message code="common.noScriptTitle.msg" /></noscript>
|
||||
|
||||
<form name="listForm" action="<c:url value='/search/SearchOne.do'/>" method="post">
|
||||
|
||||
<!-- container :s -->
|
||||
<div id="container" style="background: #fff;"><!-- 통합검색의 컨테이너에 배경컬러 스타일 꼭 넣어주세요-->
|
||||
<!-- content :s -->
|
||||
<div class="content">
|
||||
<!-- 통합검색 :s -->
|
||||
<div class="srarch-wrap">
|
||||
<!-- 검색 영역 -->
|
||||
<div class="search_form_wrap">
|
||||
<fieldset>
|
||||
<div class="search_inner">
|
||||
<span class="form_input">
|
||||
<label for="input-search-keyword" class="hidden">검색어 입력</label>
|
||||
<input name="searchKeyword" id="searchKeyword" type="text" title="검색어 입력" placeholder="검색할 내용을 입력하세요." value="${searchVO.searchKeyword}" />
|
||||
</span>
|
||||
<span class="form_btn">
|
||||
<button type="button" class="btn_search" onClick="javascript:fnSearch();">조회</button>
|
||||
</span>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
<!--//검색 영역 -->
|
||||
<!-- 검색 내용 :s -->
|
||||
<div class="search-cont">
|
||||
<!-- 통합 검색 결과 값 -->
|
||||
<div class="search_head">
|
||||
<div class="search_head_result">
|
||||
<strong>'${searchVO.searchKeyword}'</strong>에 대한 통합검색 결과 총<em>${resultCnt}</em>건입니다.
|
||||
</div>
|
||||
</div>
|
||||
<!--//통합 검색 결과 값 -->
|
||||
<!-- 검색 리스트 :s -->
|
||||
<div class="search-list-box">
|
||||
<!-- 카테고리 : 키워드 검색 건수 -->
|
||||
<div class="search-tit">
|
||||
|
||||
<c:if test="${strGb == '1'}"><strong>서비스</strong></c:if>
|
||||
<c:if test="${strGb == '2'}"><strong>보고서</strong></c:if>
|
||||
<c:if test="${strGb == '2'}"><strong>게시판</strong></c:if>
|
||||
|
||||
<span>'<span class="keyword">${searchVO.searchKeyword}</span>' 관련 정보 총<span class="keyword_num">${resultCnt}</span>건</span>
|
||||
</div>
|
||||
<!--//카테고리 : 키워드 검색 건수 -->
|
||||
<!-- 리스트 -->
|
||||
<div class="search_list">
|
||||
<ul>
|
||||
|
||||
<c:if test="${fn:length(resultList) == 0}">
|
||||
<li>검색된 내용이 없습니다.</li>
|
||||
</c:if>
|
||||
|
||||
<c:forEach var="result" items="${resultList}" varStatus="status">
|
||||
<li>
|
||||
<!-- search_cont (검색 타이틀, 페이지 경로, 출처, 날짜) :s -->
|
||||
<div class="search_cont">
|
||||
<!-- 검색 타이틀, 경로 -->
|
||||
<div class="cont-tit">
|
||||
<a href="javascript:DataDetailSearch('${strGb}', '${result.source.id}', '${result.source.metadata.in_task}')" >${result.source.title} </a>
|
||||
</div>
|
||||
<!--//검색 타이틀, 경로 -->
|
||||
<!-- 출처, 날짜 -->
|
||||
<div class="cont-info">
|
||||
<span class="source_organ">${result.source.user}</span>
|
||||
<span class="source_data">${result.source.last_date}</span>
|
||||
</div>
|
||||
<!--//출처, 날짜 -->
|
||||
</div>
|
||||
<!--//search_cont (검색 타이틀, 페이지 경로, 출처, 날짜) :e -->
|
||||
<!-- 첨부파일 -->
|
||||
<ul class="uploader">
|
||||
<li>
|
||||
${result.source.text}
|
||||
</li>
|
||||
</ul>
|
||||
<!--//첨부파일 -->
|
||||
</li>
|
||||
</c:forEach>
|
||||
</ul>
|
||||
</div>
|
||||
<!--//리스트 -->
|
||||
</div>
|
||||
<!--//검색 리스트 :e -->
|
||||
</div>
|
||||
|
||||
<!-- paging navigation : start -->
|
||||
<div class="pagination">
|
||||
<ul><ui:pagination paginationInfo="${paginationInfo}" type="image" jsFunction="fnLinkPage"/></ul>
|
||||
</div>
|
||||
<!-- paging navigation : end -->
|
||||
|
||||
</div>
|
||||
<!--//통합검색 :e -->
|
||||
</div>
|
||||
<!--//content:e -->
|
||||
</div>
|
||||
<!--//container:e -->
|
||||
|
||||
<input type="hidden" name="pageIndex" id="pageIndex" value="<c:out value='${searchVO.pageIndex}'/>"/>
|
||||
<input type="hidden" name="strGb" id="strGb" value="${strGb}"/>
|
||||
|
||||
</form>
|
||||
<!DOCTYPE html>
|
||||
|
||||
<%
|
||||
/**
|
||||
* @Class Name : SearchOne.jsp
|
||||
* @Description : 개별 검색 처리 화면
|
||||
* @Modification Information
|
||||
* @
|
||||
* @ 수정일 수정자 수정내용
|
||||
* @ ------- -------- ---------------------------
|
||||
* @ 2025.04.25 나혁제 최초 생성
|
||||
*
|
||||
* @author urp 인프라본부 나혁제
|
||||
* @since 2025.04.25
|
||||
* @version 1.0
|
||||
* @see
|
||||
*
|
||||
*/
|
||||
%>
|
||||
|
||||
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
|
||||
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
|
||||
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
|
||||
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
|
||||
|
||||
|
||||
<title>자산분류관리</title>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
|
||||
|
||||
<script type="text/javaScript" language="javascript" defer="defer">
|
||||
|
||||
//----------------------------------------
|
||||
// 화면 초기화
|
||||
// ----------------------------------------
|
||||
$(document).ready(function()
|
||||
{
|
||||
// 결재라인 높이 조정
|
||||
$("em").css("color", "red");
|
||||
$("em").css("font-weight", "bold");
|
||||
});
|
||||
|
||||
//----------------------------------------
|
||||
// 통합검색
|
||||
// ----------------------------------------
|
||||
function fnSearch()
|
||||
{
|
||||
fnLinkPage(1);
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 페이징 처리
|
||||
// ----------------------------------------
|
||||
function fnLinkPage(pageIndex)
|
||||
{
|
||||
document.listForm.pageIndex.value = pageIndex-1;
|
||||
document.listForm.action = "<c:url value='/search/SearchOne.do'/>";
|
||||
document.listForm.method="get";
|
||||
document.listForm.submit();
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 상세조회 페이지 이동처리
|
||||
// ----------------------------------------
|
||||
function DataDetailSearch(strGb, strId, strTask)
|
||||
{
|
||||
var strMenu = "";
|
||||
|
||||
// 인스던트
|
||||
if(strGb=="1")
|
||||
{
|
||||
strMenu = "&baseMenuNo=3000000&leftMenuNo=3010000";
|
||||
|
||||
$(location).attr("href", "/srm/getIncidentBySeq.do?inIncidentSeq="+strId+strMenu);
|
||||
}
|
||||
// 보고서
|
||||
else if(strGb=="2")
|
||||
{
|
||||
strMenu = "&baseMenuNo=3000000&leftMenuNo=3010000";
|
||||
|
||||
// 점검보고서
|
||||
if(strTask == 1)
|
||||
{
|
||||
$(location).attr("href", "/srm/getReportWithBodyCheck.do?inReportSeq="+strId+strMenu);
|
||||
}
|
||||
// 장애보고서
|
||||
else if(strTask == 2)
|
||||
{
|
||||
$(location).attr("href", "/srm/getReportWithBodyError.do?inReportSeq="+strId+strMenu);
|
||||
}
|
||||
// 이슈보고서
|
||||
else if(strTask == 3)
|
||||
{
|
||||
$(location).attr("href", "/srm/getReportWithBodyIssue.do?inReportSeq="+strId+strMenu);
|
||||
}
|
||||
// 2025.11.20 나혁제 기타보고서
|
||||
else if(inTask > 3)
|
||||
{
|
||||
$(location).attr("href", "/srm/getReportWithBodyOther.do?inTask="+inTask+"&inReportSeq="+strId+strMenu);
|
||||
}
|
||||
}
|
||||
else if(strGb=="3")
|
||||
{
|
||||
strMenu = "&baseMenuNo=5000000&leftMenuNo=5010000";
|
||||
|
||||
$(location).attr("href", "/bbs/admin/selectBoardArticle.do?bbsId="+bbs_id+"&nttId="+strId+strMenu);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
<!-- javascript warning tag -->
|
||||
<noscript class="noScriptTitle"><spring:message code="common.noScriptTitle.msg" /></noscript>
|
||||
|
||||
<form name="listForm" action="<c:url value='/search/SearchOne.do'/>" method="post">
|
||||
|
||||
<!-- container :s -->
|
||||
<div id="container" style="background: #fff;"><!-- 통합검색의 컨테이너에 배경컬러 스타일 꼭 넣어주세요-->
|
||||
<!-- content :s -->
|
||||
<div class="content">
|
||||
<!-- 통합검색 :s -->
|
||||
<div class="srarch-wrap">
|
||||
<!-- 검색 영역 -->
|
||||
<div class="search_form_wrap">
|
||||
<fieldset>
|
||||
<div class="search_inner">
|
||||
<span class="form_input">
|
||||
<label for="input-search-keyword" class="hidden">검색어 입력</label>
|
||||
<input name="searchKeyword" id="searchKeyword" type="text" title="검색어 입력" placeholder="검색할 내용을 입력하세요." value="${searchVO.searchKeyword}" />
|
||||
</span>
|
||||
<span class="form_btn">
|
||||
<button type="button" class="btn_search" onClick="javascript:fnSearch();">조회</button>
|
||||
</span>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
<!--//검색 영역 -->
|
||||
<!-- 검색 내용 :s -->
|
||||
<div class="search-cont">
|
||||
<!-- 통합 검색 결과 값 -->
|
||||
<div class="search_head">
|
||||
<div class="search_head_result">
|
||||
<strong>'${searchVO.searchKeyword}'</strong>에 대한 통합검색 결과 총<em>${resultCnt}</em>건입니다.
|
||||
</div>
|
||||
</div>
|
||||
<!--//통합 검색 결과 값 -->
|
||||
<!-- 검색 리스트 :s -->
|
||||
<div class="search-list-box">
|
||||
<!-- 카테고리 : 키워드 검색 건수 -->
|
||||
<div class="search-tit">
|
||||
|
||||
<c:if test="${strGb == '1'}"><strong>인스던트</strong></c:if>
|
||||
<c:if test="${strGb == '2'}"><strong>보고서</strong></c:if>
|
||||
<c:if test="${strGb == '2'}"><strong>게시판</strong></c:if>
|
||||
|
||||
<span>'<span class="keyword">${searchVO.searchKeyword}</span>' 관련 정보 총<span class="keyword_num">${resultCnt}</span>건</span>
|
||||
</div>
|
||||
<!--//카테고리 : 키워드 검색 건수 -->
|
||||
<!-- 리스트 -->
|
||||
<div class="search_list">
|
||||
<ul>
|
||||
|
||||
<c:if test="${fn:length(resultList) == 0}">
|
||||
<li>검색된 내용이 없습니다.</li>
|
||||
</c:if>
|
||||
|
||||
<c:forEach var="result" items="${resultList}" varStatus="status">
|
||||
<li>
|
||||
<!-- search_cont (검색 타이틀, 페이지 경로, 출처, 날짜) :s -->
|
||||
<div class="search_cont">
|
||||
<!-- 검색 타이틀, 경로 -->
|
||||
<div class="cont-tit">
|
||||
<a href="javascript:DataDetailSearch('${strGb}', '${result.source.id}', '${result.source.metadata.in_task}')" >${result.source.title} </a>
|
||||
</div>
|
||||
<!--//검색 타이틀, 경로 -->
|
||||
<!-- 출처, 날짜 -->
|
||||
<div class="cont-info">
|
||||
<span class="source_organ">${result.source.user}</span>
|
||||
<span class="source_data">${result.source.last_date}</span>
|
||||
</div>
|
||||
<!--//출처, 날짜 -->
|
||||
</div>
|
||||
<!--//search_cont (검색 타이틀, 페이지 경로, 출처, 날짜) :e -->
|
||||
<!-- 첨부파일 -->
|
||||
<ul class="uploader">
|
||||
<li>
|
||||
${result.source.text}
|
||||
</li>
|
||||
</ul>
|
||||
<!--//첨부파일 -->
|
||||
</li>
|
||||
</c:forEach>
|
||||
</ul>
|
||||
</div>
|
||||
<!--//리스트 -->
|
||||
</div>
|
||||
<!--//검색 리스트 :e -->
|
||||
</div>
|
||||
|
||||
<!-- paging navigation : start -->
|
||||
<div class="pagination">
|
||||
<ul><ui:pagination paginationInfo="${paginationInfo}" type="image" jsFunction="fnLinkPage"/></ul>
|
||||
</div>
|
||||
<!-- paging navigation : end -->
|
||||
|
||||
</div>
|
||||
<!--//통합검색 :e -->
|
||||
</div>
|
||||
<!--//content:e -->
|
||||
</div>
|
||||
<!--//container:e -->
|
||||
|
||||
<input type="hidden" name="pageIndex" id="pageIndex" value="<c:out value='${searchVO.pageIndex}'/>"/>
|
||||
<input type="hidden" name="strGb" id="strGb" value="${strGb}"/>
|
||||
|
||||
</form>
|
||||
|
||||
@ -1,332 +1,332 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<%
|
||||
/**
|
||||
* @Class Name : SearchTotal.jsp
|
||||
* @Description : 통합 검색 처리 화면
|
||||
* @Modification Information
|
||||
* @
|
||||
* @ 수정일 수정자 수정내용
|
||||
* @ ------- -------- ---------------------------
|
||||
* @ 2025.04.25 나혁제 최초 생성
|
||||
*
|
||||
* @author urp 인프라본부 나혁제
|
||||
* @since 2025.04.25
|
||||
* @version 1.0
|
||||
* @see
|
||||
*
|
||||
*/
|
||||
%>
|
||||
|
||||
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
|
||||
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
|
||||
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
|
||||
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
|
||||
|
||||
|
||||
<title>자산분류관리</title>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
|
||||
|
||||
<script type="text/javaScript" language="javascript" defer="defer">
|
||||
|
||||
//----------------------------------------
|
||||
// 화면 초기화
|
||||
// ----------------------------------------
|
||||
$(document).ready(function()
|
||||
{
|
||||
// 결재라인 높이 조정
|
||||
$("em").css("color", "red");
|
||||
$("em").css("font-weight", "bold");
|
||||
});
|
||||
|
||||
//----------------------------------------
|
||||
// 통합검색
|
||||
// ----------------------------------------
|
||||
function fnSearch()
|
||||
{
|
||||
document.listForm.pageIndex.value = 0;
|
||||
document.listForm.action = "<c:url value='/search/SearchTotal.do'/>";
|
||||
document.listForm.method="get";
|
||||
document.listForm.submit();
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 더보기
|
||||
// ----------------------------------------
|
||||
function fnAddView(strGb)
|
||||
{
|
||||
document.listForm.strGb.value = strGb;
|
||||
document.listForm.pageIndex.value = 0;
|
||||
document.listForm.action = "<c:url value='/search/SearchOne.do'/>";
|
||||
document.listForm.method="get";
|
||||
document.listForm.submit();
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 서비스 상세조회 화면 이동
|
||||
// ----------------------------------------
|
||||
function DataDetailIncidentSearch(strId)
|
||||
{
|
||||
var strMenu = "&baseMenuNo=3000000&leftMenuNo=3010000";
|
||||
|
||||
$(location).attr("href", "/srm/getIncidentBySeq.do?inIncidentSeq="+strId+strMenu);
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 보고서 상세조회 화면 이동
|
||||
// ----------------------------------------
|
||||
function DataDetailReportSearch(inTask, strId)
|
||||
{
|
||||
var strMenu = "&baseMenuNo=3000000&leftMenuNo=3010000";
|
||||
|
||||
// 점검보고서
|
||||
if(inTask == 1)
|
||||
{
|
||||
$(location).attr("href", "/srm/getReportWithBodyCheck.do?inReportSeq="+strId+strMenu);
|
||||
}
|
||||
// 장애보고서
|
||||
else if(inTask == 2)
|
||||
{
|
||||
$(location).attr("href", "/srm/getReportWithBodyError.do?inReportSeq="+strId+strMenu);
|
||||
}
|
||||
// 이슈보고서
|
||||
else if(inTask == 3)
|
||||
{
|
||||
$(location).attr("href", "/srm/getReportWithBodyIssue.do?inReportSeq="+strId+strMenu);
|
||||
}
|
||||
// 2025.11.20 나혁제 기타보고서
|
||||
else if(inTask > 3)
|
||||
{
|
||||
$(location).attr("href", "/srm/getReportWithBodyOther.do?inTask="+inTask+"&inReportSeq="+strId+strMenu);
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 게시물 상세조회 화면 이동
|
||||
// ----------------------------------------
|
||||
function DataDetailBbsInfoSearch(bbs_id, strId)
|
||||
{
|
||||
var strMenu = "&baseMenuNo=5000000&leftMenuNo=5010000";
|
||||
|
||||
$(location).attr("href", "/bbs/admin/selectBoardArticle.do?bbsId="+bbs_id+"&nttId="+strId+strMenu);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
<!-- javascript warning tag -->
|
||||
<noscript class="noScriptTitle"><spring:message code="common.noScriptTitle.msg" /></noscript>
|
||||
|
||||
<form name="listForm" action="<c:url value='/search/SearchTotal.do'/>" method="post">
|
||||
|
||||
<!-- container :s -->
|
||||
<div id="container" style="background: #fff;"><!-- 통합검색의 컨테이너에 배경컬러 스타일 꼭 넣어주세요-->
|
||||
<!-- content :s -->
|
||||
<div class="content">
|
||||
<!-- 통합검색 :s -->
|
||||
<div class="srarch-wrap">
|
||||
<!-- 검색 영역 -->
|
||||
<div class="search_form_wrap">
|
||||
<fieldset>
|
||||
<div class="search_inner">
|
||||
<span class="form_input">
|
||||
<label for="input-search-keyword" class="hidden">검색어 입력</label>
|
||||
<input name="searchKeyword" id="searchKeyword" type="text" title="검색어 입력" placeholder="검색할 내용을 입력하세요." value="${searchVO.searchKeyword}" />
|
||||
</span>
|
||||
<span class="form_btn">
|
||||
<button type="button" class="btn_search" onClick="javascript:fnSearch();">조회</button>
|
||||
</span>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
<!--//검색 영역 -->
|
||||
<!-- 검색 내용 :s -->
|
||||
<div class="search-cont">
|
||||
<!-- 통합 검색 결과 값 -->
|
||||
<div class="search_head">
|
||||
<div class="search_head_result">
|
||||
<strong>'${searchVO.searchKeyword}'</strong>에 대한 통합검색 결과 총<em>${iIncidentCnt+iReportCnt+iBbsInfoCnt}</em>건입니다.
|
||||
</div>
|
||||
</div>
|
||||
<!--//통합 검색 결과 값 -->
|
||||
<!-- 검색 리스트 :s -->
|
||||
<div class="search-list-box">
|
||||
<!-- 카테고리 : 키워드 검색 건수 -->
|
||||
<div class="search-tit">
|
||||
<strong>서비스</strong>
|
||||
<span>'<span class="keyword">${searchVO.searchKeyword}</span>' 관련 정보 총<span class="keyword_num">${iIncidentCnt}</span>건</span>
|
||||
</div>
|
||||
<!--//카테고리 : 키워드 검색 건수 -->
|
||||
<!-- 리스트 -->
|
||||
<div class="search_list">
|
||||
<ul>
|
||||
|
||||
<c:if test="${fn:length(listIncidentHist) == 0}">
|
||||
<li>검색된 내용이 없습니다.</li>
|
||||
</c:if>
|
||||
|
||||
<c:forEach var="result" items="${listIncidentHist}" varStatus="status">
|
||||
<li>
|
||||
<!-- search_cont (검색 타이틀, 페이지 경로, 출처, 날짜) :s -->
|
||||
<div class="search_cont">
|
||||
<!-- 검색 타이틀, 경로 -->
|
||||
<div class="cont-tit">
|
||||
<a href="javascript:DataDetailIncidentSearch('${result.source.id}')" >${result.source.title} </a>
|
||||
</div>
|
||||
<!--//검색 타이틀, 경로 -->
|
||||
<!-- 출처, 날짜 -->
|
||||
<div class="cont-info">
|
||||
<span class="source_organ">${result.source.user}</span>
|
||||
<span class="source_data">${result.source.last_date}</span>
|
||||
</div>
|
||||
<!--//출처, 날짜 -->
|
||||
</div>
|
||||
<!--//search_cont (검색 타이틀, 페이지 경로, 출처, 날짜) :e -->
|
||||
<!-- 첨부파일 -->
|
||||
<ul class="uploader">
|
||||
<li>
|
||||
${result.source.text}
|
||||
</li>
|
||||
</ul>
|
||||
<!--//첨부파일 -->
|
||||
</li>
|
||||
</c:forEach>
|
||||
</ul>
|
||||
</div>
|
||||
<!--//리스트 -->
|
||||
<!-- 더보기 버튼 -->
|
||||
<c:if test="${fn:length(listIncidentHist) > 0}">
|
||||
<div class="btn-right">
|
||||
<button type="button" class="button_more" onclick="javascript:fnAddView('1');">더보기</button>
|
||||
</div>
|
||||
</c:if>
|
||||
<!--//더보기 버튼 -->
|
||||
</div>
|
||||
<!--//검색 리스트 :e -->
|
||||
|
||||
<!-- 검색 리스트 :s -->
|
||||
<div class="search-list-box">
|
||||
<!-- 카테고리 : 키워드 검색 건수 -->
|
||||
<div class="search-tit">
|
||||
<strong>보고서</strong>
|
||||
<span>'<span class="keyword">${searchVO.searchKeyword}</span>' 관련 정보 총<span class="keyword_num">${iReportCnt}</span>건</span>
|
||||
</div>
|
||||
<!--//카테고리 : 키워드 검색 건수 -->
|
||||
<!-- 리스트 -->
|
||||
<div class="search_list">
|
||||
<ul>
|
||||
<c:if test="${fn:length(listReportHist) == 0}">
|
||||
<li>검색된 내용이 없습니다.</li>
|
||||
</c:if>
|
||||
|
||||
<c:forEach var="result" items="${listReportHist}" varStatus="status">
|
||||
<li>
|
||||
<!-- search_cont (검색 타이틀, 페이지 경로, 출처, 날짜) :s -->
|
||||
<div class="search_cont">
|
||||
<!-- 검색 타이틀, 경로 -->
|
||||
<div class="cont-tit">
|
||||
<a href="javascript:DataDetailReportSearch('${result.source.metadata.in_task}', '${result.source.id}')" >${result.source.title} </a>
|
||||
</div>
|
||||
<!--//검색 타이틀, 경로 -->
|
||||
<!-- 출처, 날짜 -->
|
||||
<div class="cont-info">
|
||||
<span class="source_organ">${result.source.user}</span>
|
||||
<span class="source_data">${result.source.last_date}</span>
|
||||
</div>
|
||||
<!--//출처, 날짜 -->
|
||||
</div>
|
||||
<!--//search_cont (검색 타이틀, 페이지 경로, 출처, 날짜) :e -->
|
||||
<!-- 첨부파일 -->
|
||||
<ul class="uploader">
|
||||
<li>
|
||||
${result.source.text}
|
||||
</li>
|
||||
</ul>
|
||||
<!--//첨부파일 -->
|
||||
</li>
|
||||
</c:forEach>
|
||||
</ul>
|
||||
</div>
|
||||
<!--//리스트 -->
|
||||
<!-- 더보기 버튼 -->
|
||||
<c:if test="${fn:length(listReportHist) > 0}">
|
||||
<div class="btn-right">
|
||||
<button type="button" class="button_more" onclick="javascript:fnAddView('2');">더보기</button>
|
||||
</div>
|
||||
</c:if>
|
||||
<!--//더보기 버튼 -->
|
||||
</div>
|
||||
<!--//검색 리스트 :e -->
|
||||
|
||||
<!-- 검색 리스트 :s -->
|
||||
<div class="search-list-box">
|
||||
<!-- 카테고리 : 키워드 검색 건수 -->
|
||||
<div class="search-tit">
|
||||
<strong>게시판</strong>
|
||||
<span>'<span class="keyword">${searchVO.searchKeyword}</span>' 관련 정보 총<span class="keyword_num">${iBbsInfoCnt}</span>건</span>
|
||||
</div>
|
||||
<!--//카테고리 : 키워드 검색 건수 -->
|
||||
<!-- 리스트 -->
|
||||
<div class="search_list">
|
||||
<ul>
|
||||
<c:if test="${fn:length(listBbsInfoHist) == 0}">
|
||||
<li>검색된 내용이 없습니다.</li>
|
||||
</c:if>
|
||||
|
||||
<c:forEach var="result" items="${listBbsInfoHist}" varStatus="status">
|
||||
<li>
|
||||
<!-- search_cont (검색 타이틀, 페이지 경로, 출처, 날짜) :s -->
|
||||
<div class="search_cont">
|
||||
<!-- 검색 타이틀, 경로 -->
|
||||
<div class="cont-tit">
|
||||
<a href="javascript:DataDetailBbsInfoSearch('${result.source.metadata.bbs_id}', '${result.source.id}')" >${result.source.title} </a>
|
||||
</div>
|
||||
<!--//검색 타이틀, 경로 -->
|
||||
<!-- 출처, 날짜 -->
|
||||
<div class="cont-info">
|
||||
<span class="source_organ">${result.source.user}</span>
|
||||
<span class="source_data">${result.source.last_date}</span>
|
||||
</div>
|
||||
<!--//출처, 날짜 -->
|
||||
</div>
|
||||
<!--//search_cont (검색 타이틀, 페이지 경로, 출처, 날짜) :e -->
|
||||
<!-- 첨부파일 -->
|
||||
<ul class="uploader">
|
||||
<li>
|
||||
${result.source.text}
|
||||
</li>
|
||||
</ul>
|
||||
<!--//첨부파일 -->
|
||||
</li>
|
||||
</c:forEach>
|
||||
</ul>
|
||||
</div>
|
||||
<!--//리스트 -->
|
||||
<!-- 더보기 버튼 -->
|
||||
<c:if test="${fn:length(listBbsInfoHist) > 0}">
|
||||
<div class="btn-right">
|
||||
<button type="button" class="button_more" onclick="javascript:fnAddView('3');">더보기</button>
|
||||
</div>
|
||||
</c:if>
|
||||
<!--//더보기 버튼 -->
|
||||
</div>
|
||||
<!--//검색 리스트 :e -->
|
||||
</div>
|
||||
<!--//검색 내용 :e -->
|
||||
</div>
|
||||
<!--//통합검색 :e -->
|
||||
</div>
|
||||
<!--//content:e -->
|
||||
</div>
|
||||
<!--//container:e -->
|
||||
|
||||
<input type="hidden" name="pageIndex" id="pageIndex" value="<c:out value='${searchVO.pageIndex}'/>"/>
|
||||
<input type="hidden" name="strGb" id="strGb" value=""/>
|
||||
|
||||
</form>
|
||||
<!DOCTYPE html>
|
||||
|
||||
<%
|
||||
/**
|
||||
* @Class Name : SearchTotal.jsp
|
||||
* @Description : 통합 검색 처리 화면
|
||||
* @Modification Information
|
||||
* @
|
||||
* @ 수정일 수정자 수정내용
|
||||
* @ ------- -------- ---------------------------
|
||||
* @ 2025.04.25 나혁제 최초 생성
|
||||
*
|
||||
* @author urp 인프라본부 나혁제
|
||||
* @since 2025.04.25
|
||||
* @version 1.0
|
||||
* @see
|
||||
*
|
||||
*/
|
||||
%>
|
||||
|
||||
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
|
||||
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
|
||||
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
|
||||
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
|
||||
|
||||
|
||||
<title>자산분류관리</title>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
|
||||
|
||||
<script type="text/javaScript" language="javascript" defer="defer">
|
||||
|
||||
//----------------------------------------
|
||||
// 화면 초기화
|
||||
// ----------------------------------------
|
||||
$(document).ready(function()
|
||||
{
|
||||
// 결재라인 높이 조정
|
||||
$("em").css("color", "red");
|
||||
$("em").css("font-weight", "bold");
|
||||
});
|
||||
|
||||
//----------------------------------------
|
||||
// 통합검색
|
||||
// ----------------------------------------
|
||||
function fnSearch()
|
||||
{
|
||||
document.listForm.pageIndex.value = 0;
|
||||
document.listForm.action = "<c:url value='/search/SearchTotal.do'/>";
|
||||
document.listForm.method="get";
|
||||
document.listForm.submit();
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 더보기
|
||||
// ----------------------------------------
|
||||
function fnAddView(strGb)
|
||||
{
|
||||
document.listForm.strGb.value = strGb;
|
||||
document.listForm.pageIndex.value = 0;
|
||||
document.listForm.action = "<c:url value='/search/SearchOne.do'/>";
|
||||
document.listForm.method="get";
|
||||
document.listForm.submit();
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 인스던트 상세조회 화면 이동
|
||||
// ----------------------------------------
|
||||
function DataDetailIncidentSearch(strId)
|
||||
{
|
||||
var strMenu = "&baseMenuNo=3000000&leftMenuNo=3010000";
|
||||
|
||||
$(location).attr("href", "/srm/getIncidentBySeq.do?inIncidentSeq="+strId+strMenu);
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 보고서 상세조회 화면 이동
|
||||
// ----------------------------------------
|
||||
function DataDetailReportSearch(inTask, strId)
|
||||
{
|
||||
var strMenu = "&baseMenuNo=3000000&leftMenuNo=3010000";
|
||||
|
||||
// 점검보고서
|
||||
if(inTask == 1)
|
||||
{
|
||||
$(location).attr("href", "/srm/getReportWithBodyCheck.do?inReportSeq="+strId+strMenu);
|
||||
}
|
||||
// 장애보고서
|
||||
else if(inTask == 2)
|
||||
{
|
||||
$(location).attr("href", "/srm/getReportWithBodyError.do?inReportSeq="+strId+strMenu);
|
||||
}
|
||||
// 이슈보고서
|
||||
else if(inTask == 3)
|
||||
{
|
||||
$(location).attr("href", "/srm/getReportWithBodyIssue.do?inReportSeq="+strId+strMenu);
|
||||
}
|
||||
// 2025.11.20 나혁제 기타보고서
|
||||
else if(inTask > 3)
|
||||
{
|
||||
$(location).attr("href", "/srm/getReportWithBodyOther.do?inTask="+inTask+"&inReportSeq="+strId+strMenu);
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 게시물 상세조회 화면 이동
|
||||
// ----------------------------------------
|
||||
function DataDetailBbsInfoSearch(bbs_id, strId)
|
||||
{
|
||||
var strMenu = "&baseMenuNo=5000000&leftMenuNo=5010000";
|
||||
|
||||
$(location).attr("href", "/bbs/admin/selectBoardArticle.do?bbsId="+bbs_id+"&nttId="+strId+strMenu);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
<!-- javascript warning tag -->
|
||||
<noscript class="noScriptTitle"><spring:message code="common.noScriptTitle.msg" /></noscript>
|
||||
|
||||
<form name="listForm" action="<c:url value='/search/SearchTotal.do'/>" method="post">
|
||||
|
||||
<!-- container :s -->
|
||||
<div id="container" style="background: #fff;"><!-- 통합검색의 컨테이너에 배경컬러 스타일 꼭 넣어주세요-->
|
||||
<!-- content :s -->
|
||||
<div class="content">
|
||||
<!-- 통합검색 :s -->
|
||||
<div class="srarch-wrap">
|
||||
<!-- 검색 영역 -->
|
||||
<div class="search_form_wrap">
|
||||
<fieldset>
|
||||
<div class="search_inner">
|
||||
<span class="form_input">
|
||||
<label for="input-search-keyword" class="hidden">검색어 입력</label>
|
||||
<input name="searchKeyword" id="searchKeyword" type="text" title="검색어 입력" placeholder="검색할 내용을 입력하세요." value="${searchVO.searchKeyword}" />
|
||||
</span>
|
||||
<span class="form_btn">
|
||||
<button type="button" class="btn_search" onClick="javascript:fnSearch();">조회</button>
|
||||
</span>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
<!--//검색 영역 -->
|
||||
<!-- 검색 내용 :s -->
|
||||
<div class="search-cont">
|
||||
<!-- 통합 검색 결과 값 -->
|
||||
<div class="search_head">
|
||||
<div class="search_head_result">
|
||||
<strong>'${searchVO.searchKeyword}'</strong>에 대한 통합검색 결과 총<em>${iIncidentCnt+iReportCnt+iBbsInfoCnt}</em>건입니다.
|
||||
</div>
|
||||
</div>
|
||||
<!--//통합 검색 결과 값 -->
|
||||
<!-- 검색 리스트 :s -->
|
||||
<div class="search-list-box">
|
||||
<!-- 카테고리 : 키워드 검색 건수 -->
|
||||
<div class="search-tit">
|
||||
<strong>인스던트</strong>
|
||||
<span>'<span class="keyword">${searchVO.searchKeyword}</span>' 관련 정보 총<span class="keyword_num">${iIncidentCnt}</span>건</span>
|
||||
</div>
|
||||
<!--//카테고리 : 키워드 검색 건수 -->
|
||||
<!-- 리스트 -->
|
||||
<div class="search_list">
|
||||
<ul>
|
||||
|
||||
<c:if test="${fn:length(listIncidentHist) == 0}">
|
||||
<li>검색된 내용이 없습니다.</li>
|
||||
</c:if>
|
||||
|
||||
<c:forEach var="result" items="${listIncidentHist}" varStatus="status">
|
||||
<li>
|
||||
<!-- search_cont (검색 타이틀, 페이지 경로, 출처, 날짜) :s -->
|
||||
<div class="search_cont">
|
||||
<!-- 검색 타이틀, 경로 -->
|
||||
<div class="cont-tit">
|
||||
<a href="javascript:DataDetailIncidentSearch('${result.source.id}')" >${result.source.title} </a>
|
||||
</div>
|
||||
<!--//검색 타이틀, 경로 -->
|
||||
<!-- 출처, 날짜 -->
|
||||
<div class="cont-info">
|
||||
<span class="source_organ">${result.source.user}</span>
|
||||
<span class="source_data">${result.source.last_date}</span>
|
||||
</div>
|
||||
<!--//출처, 날짜 -->
|
||||
</div>
|
||||
<!--//search_cont (검색 타이틀, 페이지 경로, 출처, 날짜) :e -->
|
||||
<!-- 첨부파일 -->
|
||||
<ul class="uploader">
|
||||
<li>
|
||||
${result.source.text}
|
||||
</li>
|
||||
</ul>
|
||||
<!--//첨부파일 -->
|
||||
</li>
|
||||
</c:forEach>
|
||||
</ul>
|
||||
</div>
|
||||
<!--//리스트 -->
|
||||
<!-- 더보기 버튼 -->
|
||||
<c:if test="${fn:length(listIncidentHist) > 0}">
|
||||
<div class="btn-right">
|
||||
<button type="button" class="button_more" onclick="javascript:fnAddView('1');">더보기</button>
|
||||
</div>
|
||||
</c:if>
|
||||
<!--//더보기 버튼 -->
|
||||
</div>
|
||||
<!--//검색 리스트 :e -->
|
||||
|
||||
<!-- 검색 리스트 :s -->
|
||||
<div class="search-list-box">
|
||||
<!-- 카테고리 : 키워드 검색 건수 -->
|
||||
<div class="search-tit">
|
||||
<strong>보고서</strong>
|
||||
<span>'<span class="keyword">${searchVO.searchKeyword}</span>' 관련 정보 총<span class="keyword_num">${iReportCnt}</span>건</span>
|
||||
</div>
|
||||
<!--//카테고리 : 키워드 검색 건수 -->
|
||||
<!-- 리스트 -->
|
||||
<div class="search_list">
|
||||
<ul>
|
||||
<c:if test="${fn:length(listReportHist) == 0}">
|
||||
<li>검색된 내용이 없습니다.</li>
|
||||
</c:if>
|
||||
|
||||
<c:forEach var="result" items="${listReportHist}" varStatus="status">
|
||||
<li>
|
||||
<!-- search_cont (검색 타이틀, 페이지 경로, 출처, 날짜) :s -->
|
||||
<div class="search_cont">
|
||||
<!-- 검색 타이틀, 경로 -->
|
||||
<div class="cont-tit">
|
||||
<a href="javascript:DataDetailReportSearch('${result.source.metadata.in_task}', '${result.source.id}')" >${result.source.title} </a>
|
||||
</div>
|
||||
<!--//검색 타이틀, 경로 -->
|
||||
<!-- 출처, 날짜 -->
|
||||
<div class="cont-info">
|
||||
<span class="source_organ">${result.source.user}</span>
|
||||
<span class="source_data">${result.source.last_date}</span>
|
||||
</div>
|
||||
<!--//출처, 날짜 -->
|
||||
</div>
|
||||
<!--//search_cont (검색 타이틀, 페이지 경로, 출처, 날짜) :e -->
|
||||
<!-- 첨부파일 -->
|
||||
<ul class="uploader">
|
||||
<li>
|
||||
${result.source.text}
|
||||
</li>
|
||||
</ul>
|
||||
<!--//첨부파일 -->
|
||||
</li>
|
||||
</c:forEach>
|
||||
</ul>
|
||||
</div>
|
||||
<!--//리스트 -->
|
||||
<!-- 더보기 버튼 -->
|
||||
<c:if test="${fn:length(listReportHist) > 0}">
|
||||
<div class="btn-right">
|
||||
<button type="button" class="button_more" onclick="javascript:fnAddView('2');">더보기</button>
|
||||
</div>
|
||||
</c:if>
|
||||
<!--//더보기 버튼 -->
|
||||
</div>
|
||||
<!--//검색 리스트 :e -->
|
||||
|
||||
<!-- 검색 리스트 :s -->
|
||||
<div class="search-list-box">
|
||||
<!-- 카테고리 : 키워드 검색 건수 -->
|
||||
<div class="search-tit">
|
||||
<strong>게시판</strong>
|
||||
<span>'<span class="keyword">${searchVO.searchKeyword}</span>' 관련 정보 총<span class="keyword_num">${iBbsInfoCnt}</span>건</span>
|
||||
</div>
|
||||
<!--//카테고리 : 키워드 검색 건수 -->
|
||||
<!-- 리스트 -->
|
||||
<div class="search_list">
|
||||
<ul>
|
||||
<c:if test="${fn:length(listBbsInfoHist) == 0}">
|
||||
<li>검색된 내용이 없습니다.</li>
|
||||
</c:if>
|
||||
|
||||
<c:forEach var="result" items="${listBbsInfoHist}" varStatus="status">
|
||||
<li>
|
||||
<!-- search_cont (검색 타이틀, 페이지 경로, 출처, 날짜) :s -->
|
||||
<div class="search_cont">
|
||||
<!-- 검색 타이틀, 경로 -->
|
||||
<div class="cont-tit">
|
||||
<a href="javascript:DataDetailBbsInfoSearch('${result.source.metadata.bbs_id}', '${result.source.id}')" >${result.source.title} </a>
|
||||
</div>
|
||||
<!--//검색 타이틀, 경로 -->
|
||||
<!-- 출처, 날짜 -->
|
||||
<div class="cont-info">
|
||||
<span class="source_organ">${result.source.user}</span>
|
||||
<span class="source_data">${result.source.last_date}</span>
|
||||
</div>
|
||||
<!--//출처, 날짜 -->
|
||||
</div>
|
||||
<!--//search_cont (검색 타이틀, 페이지 경로, 출처, 날짜) :e -->
|
||||
<!-- 첨부파일 -->
|
||||
<ul class="uploader">
|
||||
<li>
|
||||
${result.source.text}
|
||||
</li>
|
||||
</ul>
|
||||
<!--//첨부파일 -->
|
||||
</li>
|
||||
</c:forEach>
|
||||
</ul>
|
||||
</div>
|
||||
<!--//리스트 -->
|
||||
<!-- 더보기 버튼 -->
|
||||
<c:if test="${fn:length(listBbsInfoHist) > 0}">
|
||||
<div class="btn-right">
|
||||
<button type="button" class="button_more" onclick="javascript:fnAddView('3');">더보기</button>
|
||||
</div>
|
||||
</c:if>
|
||||
<!--//더보기 버튼 -->
|
||||
</div>
|
||||
<!--//검색 리스트 :e -->
|
||||
</div>
|
||||
<!--//검색 내용 :e -->
|
||||
</div>
|
||||
<!--//통합검색 :e -->
|
||||
</div>
|
||||
<!--//content:e -->
|
||||
</div>
|
||||
<!--//container:e -->
|
||||
|
||||
<input type="hidden" name="pageIndex" id="pageIndex" value="<c:out value='${searchVO.pageIndex}'/>"/>
|
||||
<input type="hidden" name="strGb" id="strGb" value=""/>
|
||||
|
||||
</form>
|
||||
|
||||
@ -700,7 +700,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th> 서비스 접수번호 </th>
|
||||
<th> 인스던트 접수번호 </th>
|
||||
<td> </td>
|
||||
<th> 작업분류 </th>
|
||||
<td>
|
||||
@ -923,8 +923,8 @@
|
||||
<button type="button" class="btn-etc" onclick="fncReportCheckInsertApp(); return false;" title="등록/승인요청" >
|
||||
등록/승인요청
|
||||
</button>
|
||||
<button type="button" class="btn-etc" onclick="fncReportCheckInsert(); return false;" title="임시저장">
|
||||
임시저장
|
||||
<button type="button" class="btn-etc" onclick="fncReportCheckInsert(); return false;" title="<spring:message code="button.create" />">
|
||||
<spring:message code="button.create" />
|
||||
</button>
|
||||
</div>
|
||||
<!-- // 오른쪽영역-->
|
||||
|
||||
@ -503,7 +503,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th> 서비스 접수번호 </th>
|
||||
<th> 인스던트 접수번호 </th>
|
||||
<td>
|
||||
${incidentId}
|
||||
</td>
|
||||
|
||||
@ -811,7 +811,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th> 서비스 접수번호 </th>
|
||||
<th> 인스던트 접수번호 </th>
|
||||
<td>${resultIncident.vcIncidentNum} </td>
|
||||
<th> 작업분류 </th>
|
||||
<td>
|
||||
@ -992,8 +992,8 @@
|
||||
<button type="button" class="btn-etc" onclick="fncReportCheckInsertApp(); return false;" title="등록/승인요청" >
|
||||
등록/승인요청
|
||||
</button>
|
||||
<button type="button" class="btn-etc" onclick="fncReportCheckInsert(); return false;" title="임시저장">
|
||||
임시저장
|
||||
<button type="button" class="btn-etc" onclick="fncReportCheckInsert(); return false;" title="<spring:message code="button.create" />">
|
||||
<spring:message code="button.create" />
|
||||
</button>
|
||||
</div>
|
||||
<!-- // 오른쪽영역-->
|
||||
|
||||
@ -164,7 +164,7 @@
|
||||
<input class="s_input" id="reportId" name="reportId" type="text" size="35" maxlength="155" style="width: 155px;"
|
||||
value='<c:out value="${searchVO.reportId}"/>' title="<spring:message code="title.search" /> <spring:message code="input.input" />" >
|
||||
|
||||
<label>서비스 접수번호:</label>
|
||||
<label>인스던트 접수번호:</label>
|
||||
<input class="s_input" id="incidentNum" name="incidentNum" type="text" size="35" maxlength="155" style="width: 155px;"
|
||||
value='<c:out value="${searchVO.incidentNum}"/>' title="<spring:message code="title.search" /> <spring:message code="input.input" />" >
|
||||
|
||||
@ -226,7 +226,7 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<th>문서번호</th>
|
||||
<th>서비스 접수번호</th>
|
||||
<th>인스던트 접수번호</th>
|
||||
<th>서비스</th>
|
||||
<th>승인상태</th>
|
||||
<th>제목</th>
|
||||
@ -250,10 +250,8 @@
|
||||
<td><c:out value="${reportList.vcReportStatus}"/></td>
|
||||
|
||||
<!-- 2025.11.17 나혁제 제목이 35자 이상인경우 -->
|
||||
<!-- 2026.07.19 기능개선06/F06 : 제목 클릭으로도 상세 진입 가능 -->
|
||||
<td title="${reportList.vcReportTitle}">
|
||||
<a href="javascript:fncSelectReportCheck('${reportList.inReportSeq}')">
|
||||
<c:choose>
|
||||
<c:choose>
|
||||
<c:when test="${fn:length(reportList.vcReportTitle) > 25}">
|
||||
<c:out value="${fn:substring(reportList.vcReportTitle,0,25)}"/>...
|
||||
</c:when >
|
||||
@ -261,7 +259,6 @@
|
||||
<c:out value="${reportList.vcReportTitle}"/>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</a>
|
||||
</td>
|
||||
<%-- 2026.03.11 나혁제 작성자 부분 그룹 추가 --%>
|
||||
<td>
|
||||
|
||||
@ -184,7 +184,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th> 서비스 접수번호 </th>
|
||||
<th> 인스던트 접수번호 </th>
|
||||
<td>
|
||||
${incidentId}
|
||||
</td>
|
||||
|
||||
@ -800,7 +800,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th> 서비스 접수번호 </th>
|
||||
<th> 인스던트 접수번호 </th>
|
||||
<td>${incidentId}</td>
|
||||
<th> 작업분류 </th>
|
||||
<td>
|
||||
|
||||
@ -701,7 +701,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th> 서비스 접수번호 </th>
|
||||
<th> 인스던트 접수번호 </th>
|
||||
<td> </td>
|
||||
<th> 작업분류 </th>
|
||||
<td>
|
||||
@ -926,8 +926,8 @@
|
||||
<button type="button" class="btn-etc" onclick="fncReportErrorInsertApp(); return false;" title="등록/승인요청" >
|
||||
등록/승인요청
|
||||
</button>
|
||||
<button type="button" class="btn-etc" onclick="fncReportErrorInsert(); return false;" title="임시저장">
|
||||
임시저장
|
||||
<button type="button" class="btn-etc" onclick="fncReportErrorInsert(); return false;" title="<spring:message code="button.create" />">
|
||||
<spring:message code="button.create" />
|
||||
</button>
|
||||
</div>
|
||||
<!-- // 오른쪽영역-->
|
||||
|
||||
@ -480,7 +480,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th> 서비스 접수번호 </th>
|
||||
<th> 인스던트 접수번호 </th>
|
||||
<td>
|
||||
${incidentId}
|
||||
</td>
|
||||
|
||||
@ -808,7 +808,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th> 서비스 접수번호 </th>
|
||||
<th> 인스던트 접수번호 </th>
|
||||
<td>${resultIncident.vcIncidentNum} </td>
|
||||
<th> 작업분류 </th>
|
||||
<td>
|
||||
@ -992,8 +992,8 @@
|
||||
<button type="button" class="btn-etc" onclick="fncReportErrorInsertApp(); return false;" title="등록/승인요청" >
|
||||
등록/승인요청
|
||||
</button>
|
||||
<button type="button" class="btn-etc" onclick="fncReportErrorInsert(); return false;" title="임시저장">
|
||||
임시저장
|
||||
<button type="button" class="btn-etc" onclick="fncReportErrorInsert(); return false;" title="<spring:message code="button.create" />">
|
||||
<spring:message code="button.create" />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -164,7 +164,7 @@
|
||||
<input class="s_input" id="reportId" name="reportId" type="text" size="35" maxlength="155" style="width: 155px;"
|
||||
value='<c:out value="${searchVO.reportId}"/>' title="<spring:message code="title.search" /> <spring:message code="input.input" />" >
|
||||
|
||||
<label>서비스 접수번호:</label>
|
||||
<label>인스던트 접수번호:</label>
|
||||
<input class="s_input" id="incidentNum" name="incidentNum" type="text" size="35" maxlength="155" style="width: 155px;"
|
||||
value='<c:out value="${searchVO.incidentNum}"/>' title="<spring:message code="title.search" /> <spring:message code="input.input" />" >
|
||||
|
||||
@ -226,7 +226,7 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<th>문서번호</th>
|
||||
<th>서비스 접수번호</th>
|
||||
<th>인스던트 접수번호</th>
|
||||
<th>서비스</th>
|
||||
<th>승인상태</th>
|
||||
<th>제목</th>
|
||||
|
||||
@ -160,7 +160,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th> 서비스 접수번호 </th>
|
||||
<th> 인스던트 접수번호 </th>
|
||||
<td>
|
||||
${incidentId}
|
||||
</td>
|
||||
|
||||
@ -795,7 +795,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th> 서비스 접수번호 </th>
|
||||
<th> 인스던트 접수번호 </th>
|
||||
<td>${incidentId}</td>
|
||||
<th> 작업분류 </th>
|
||||
<td>
|
||||
|
||||
@ -701,7 +701,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th> 서비스 접수번호 </th>
|
||||
<th> 인스던트 접수번호 </th>
|
||||
<td> </td>
|
||||
<th> 작업분류 </th>
|
||||
<td>
|
||||
@ -921,8 +921,8 @@
|
||||
<button type="button" class="btn-etc" onclick="fncReportIssueInsertApp(); return false;" title="등록/승인요청" >
|
||||
등록/승인요청
|
||||
</button>
|
||||
<button type="button" class="btn-etc" onclick="fncReportIssueInsert(); return false;" title="임시저장">
|
||||
임시저장
|
||||
<button type="button" class="btn-etc" onclick="fncReportIssueInsert(); return false;" title="<spring:message code="button.create" />">
|
||||
<spring:message code="button.create" />
|
||||
</button>
|
||||
</div>
|
||||
<!-- // 오른쪽영역-->
|
||||
|
||||
@ -498,7 +498,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th> 서비스 접수번호 </th>
|
||||
<th> 인스던트 접수번호 </th>
|
||||
<td>
|
||||
${incidentId}
|
||||
</td>
|
||||
@ -677,7 +677,10 @@
|
||||
</c:if>
|
||||
|
||||
<c:if test="${(privType eq 'mine' && report.inReportStatus ne 3) || privType eq 'super'}">
|
||||
<!-- 2026.07.19 SR#8 중복 '새로만들기' 버튼 제거 (상단 승인요청 블록의 새로만들기로 일원화) -->
|
||||
<!-- 2026.01.22 나혁제 새로만들기 기능 추가 -->
|
||||
<button type="button" class="btn-etc" title="새로만들기" onclick="fncReportIssueCopyInsert(); return false;">
|
||||
새로만들기
|
||||
</button>
|
||||
<button type="button" class="btn-etc" title="수정" onclick="fncReportIssueUpdate(); return false;">
|
||||
수정
|
||||
</button>
|
||||
|
||||
@ -810,7 +810,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th> 서비스 접수번호 </th>
|
||||
<th> 인스던트 접수번호 </th>
|
||||
<td>${resultIncident.vcIncidentNum} </td>
|
||||
<th> 작업분류 </th>
|
||||
<td>
|
||||
@ -989,8 +989,8 @@
|
||||
<button type="button" class="btn-etc" onclick="fncReportIssueInsertApp(); return false;" title="등록/승인요청" >
|
||||
등록/승인요청
|
||||
</button>
|
||||
<button type="button" class="btn-etc" onclick="fncReportIssueInsert(); return false;" title="임시저장">
|
||||
임시저장
|
||||
<button type="button" class="btn-etc" onclick="fncReportIssueInsert(); return false;" title="<spring:message code="button.create" />">
|
||||
<spring:message code="button.create" />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -164,7 +164,7 @@
|
||||
<input class="s_input" id="reportId" name="reportId" type="text" size="35" maxlength="155" style="width: 155px;"
|
||||
value='<c:out value="${searchVO.reportId}"/>' title="<spring:message code="title.search" /> <spring:message code="input.input" />" >
|
||||
|
||||
<label>서비스 접수번호:</label>
|
||||
<label>인스던트 접수번호:</label>
|
||||
<input class="s_input" id="incidentNum" name="incidentNum" type="text" size="35" maxlength="155" style="width: 155px;"
|
||||
value='<c:out value="${searchVO.incidentNum}"/>' title="<spring:message code="title.search" /> <spring:message code="input.input" />" >
|
||||
|
||||
@ -226,7 +226,7 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<th>문서번호</th>
|
||||
<th>서비스 접수번호</th>
|
||||
<th>인스던트 접수번호</th>
|
||||
<th>서비스</th>
|
||||
<th>승인상태</th>
|
||||
<th>제목</th>
|
||||
|
||||
@ -160,7 +160,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th> 서비스 접수번호 </th>
|
||||
<th> 인스던트 접수번호 </th>
|
||||
<td>
|
||||
${incidentId}
|
||||
</td>
|
||||
|
||||
@ -792,7 +792,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th> 서비스 접수번호 </th>
|
||||
<th> 인스던트 접수번호 </th>
|
||||
<td>${incidentId}</td>
|
||||
<th> 작업분류 </th>
|
||||
<td>
|
||||
|
||||
@ -700,7 +700,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th> 서비스 접수번호 </th>
|
||||
<th> 인스던트 접수번호 </th>
|
||||
<td> </td>
|
||||
<th> 작업분류 </th>
|
||||
<td>
|
||||
@ -923,8 +923,8 @@
|
||||
<button type="button" class="btn-etc" onclick="fncReportOtherInsertApp(); return false;" title="등록/승인요청" >
|
||||
등록/승인요청
|
||||
</button>
|
||||
<button type="button" class="btn-etc" onclick="fncReportOtherInsert(); return false;" title="임시저장">
|
||||
임시저장
|
||||
<button type="button" class="btn-etc" onclick="fncReportOtherInsert(); return false;" title="<spring:message code="button.create" />">
|
||||
<spring:message code="button.create" />
|
||||
</button>
|
||||
</div>
|
||||
<!-- // 오른쪽영역-->
|
||||
|
||||
@ -519,7 +519,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th> 서비스 접수번호 </th>
|
||||
<th> 인스던트 접수번호 </th>
|
||||
<td>
|
||||
${incidentId}
|
||||
</td>
|
||||
|
||||
@ -828,7 +828,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th> 서비스 접수번호 </th>
|
||||
<th> 인스던트 접수번호 </th>
|
||||
<td>${resultIncident.vcIncidentNum} </td>
|
||||
<th> 작업분류 </th>
|
||||
<td>
|
||||
@ -1006,8 +1006,8 @@
|
||||
<button type="button" class="btn-etc" onclick="fncReportOtherInsertApp(); return false;" title="등록/승인요청" >
|
||||
등록/승인요청
|
||||
</button>
|
||||
<button type="button" class="btn-etc" onclick="fncReportOtherInsert(); return false;" title="임시저장">
|
||||
임시저장
|
||||
<button type="button" class="btn-etc" onclick="fncReportOtherInsert(); return false;" title="<spring:message code="button.create" />">
|
||||
<spring:message code="button.create" />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -168,7 +168,7 @@
|
||||
<input class="s_input" id="reportId" name="reportId" type="text" size="35" maxlength="155" style="width: 155px;"
|
||||
value='<c:out value="${searchVO.reportId}"/>' title="<spring:message code="title.search" /> <spring:message code="input.input" />" >
|
||||
|
||||
<label>서비스 접수번호:</label>
|
||||
<label>인스던트 접수번호:</label>
|
||||
<input class="s_input" id="incidentNum" name="incidentNum" type="text" size="35" maxlength="155" style="width: 155px;"
|
||||
value='<c:out value="${searchVO.incidentNum}"/>' title="<spring:message code="title.search" /> <spring:message code="input.input" />" >
|
||||
|
||||
@ -230,7 +230,7 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<th>문서번호</th>
|
||||
<th>서비스 접수번호</th>
|
||||
<th>인스던트 접수번호</th>
|
||||
<th>서비스</th>
|
||||
<th>승인상태</th>
|
||||
<th>제목</th>
|
||||
|
||||
@ -184,7 +184,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th> 서비스 접수번호 </th>
|
||||
<th> 인스던트 접수번호 </th>
|
||||
<td>
|
||||
${incidentId}
|
||||
</td>
|
||||
|
||||
@ -802,7 +802,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th> 서비스 접수번호 </th>
|
||||
<th> 인스던트 접수번호 </th>
|
||||
<td>${incidentId}</td>
|
||||
<th> 작업분류 </th>
|
||||
<td>
|
||||
|
||||
@ -30,7 +30,7 @@
|
||||
<%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %>
|
||||
|
||||
|
||||
<title> 서비스 수정 </title>
|
||||
<title> 인스던트 수정 </title>
|
||||
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
|
||||
@ -228,7 +228,7 @@
|
||||
// ----------------------------------------
|
||||
function fncSvcDeskIncidentInsert()
|
||||
{
|
||||
var bYes = confirm("서비스 접수 처리를 하시겠습니까?");
|
||||
var bYes = confirm("인스던트 접수 처리를 하시겠습니까?");
|
||||
if(bYes==false) return;
|
||||
|
||||
var form = document.svcDeskManage;
|
||||
@ -264,7 +264,7 @@
|
||||
// ----------------------------------------
|
||||
function fncSvcDeskIncidentInsertReqApp()
|
||||
{
|
||||
var bYes = confirm("서비스 등록/승인요청 처리를 하시겠습니까?");
|
||||
var bYes = confirm("인스던트 등록/승인요청 처리를 하시겠습니까?");
|
||||
if(bYes==false) return;
|
||||
|
||||
var form = document.svcDeskManage;
|
||||
@ -298,7 +298,7 @@
|
||||
|
||||
|
||||
//----------------------------------------
|
||||
// 서비스 변경/승인처리 처리(최종 저장 처리 )
|
||||
// 인스던트 변경/승인처리 처리(최종 저장 처리 )
|
||||
// ----------------------------------------
|
||||
function fncAppLast(strMsg)
|
||||
{
|
||||
@ -429,7 +429,7 @@
|
||||
// ----------------------------------------
|
||||
var proc =
|
||||
{
|
||||
// 서비스 접수
|
||||
// 인스던트 접수
|
||||
fn_incident_save : function ()
|
||||
{
|
||||
var form = $('#svcDeskManage')[0];
|
||||
@ -452,7 +452,7 @@
|
||||
},
|
||||
error: function(errorThrown)
|
||||
{
|
||||
alert("서비스 접수 등록중 오류가 발생하였습니다. \n 시스템관리자에게 문의해 주시기 바랍니다.");
|
||||
alert("인스던트 접수 등록중 오류가 발생하였습니다. \n 시스템관리자에게 문의해 주시기 바랍니다.");
|
||||
console.log(JSON.stringify(errorThrown));
|
||||
}
|
||||
});
|
||||
@ -527,7 +527,7 @@
|
||||
<ul class="route_navi">
|
||||
<li><a href="#" title="홈"><span class="home">홈</span></a></li>
|
||||
<li><a href="#" title="SR관리">SR관리</a></li>
|
||||
<li>서비스 수정</li>
|
||||
<li>인스던트 수정</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@ -723,8 +723,8 @@
|
||||
<button type="button" class="btn-etc" title="등록/승인요청" onclick="fncSvcDeskIncidentInsertReqApp(); return false;">
|
||||
등록/승인요청
|
||||
</button>
|
||||
<button type="button" class="btn-etc" title="임시저장" onclick="fncSvcDeskIncidentInsert(); return false;">
|
||||
임시저장
|
||||
<button type="button" class="btn-etc" title="<spring:message code="button.create" />" onclick="fncSvcDeskIncidentInsert(); return false;">
|
||||
<spring:message code="button.create" />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -30,7 +30,7 @@
|
||||
<%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %>
|
||||
|
||||
|
||||
<title> 서비스 상세조회 </title>
|
||||
<title> 인스던트 상세조회 </title>
|
||||
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
|
||||
@ -89,27 +89,27 @@
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 서비스 수정 화면 이동처리
|
||||
// 인스던트 수정 화면 이동처리
|
||||
// ----------------------------------------
|
||||
function fncSvcDeskIncidentUpdate()
|
||||
{
|
||||
|
||||
if($('#inIncidentStatus').val()=='1')
|
||||
{
|
||||
if(confirm("서비스가 승인 진행중입니다.\n수정하면 모든 승인 정보는 초기화 됩니다.\n수정하시겠습니까?") == false) return;
|
||||
if(confirm("인시던트가 승인 진행중입니다.\n수정하면 모든 승인 정보는 초기화 됩니다.\n수정하시겠습니까?") == false) return;
|
||||
}
|
||||
else if($('#inIncidentStatus').val() == '2')
|
||||
{
|
||||
// 2025.11.18 나혁제 반려된 자료 수정불가
|
||||
// if(confirm("반려된 서비스입니다.\n수정하면 모든 승인 정보는 초기화 됩니다.\n수정하시겠습니까?") == false) return;
|
||||
alert("반려된 서비스입니다.\n 재작성하시길 바랍니다.");
|
||||
// if(confirm("반려된 인시던트입니다.\n수정하면 모든 승인 정보는 초기화 됩니다.\n수정하시겠습니까?") == false) return;
|
||||
alert("반려된 인시던트입니다.\n 재작성하시길 바랍니다.");
|
||||
return;
|
||||
}
|
||||
else if($('#inIncidentStatus').val() == '3')
|
||||
{
|
||||
// 2025.11.18 나혁제 반려된 자료 수정불가
|
||||
// if(confirm("승인완료된 서비스입니다.\n수정하면 모든 승인 정보는 초기화 됩니다.\n수정하시겠습니까?") == false) return;
|
||||
alert("승인완료된 서비스입니다.\n 재작성하시길 바랍니다.");
|
||||
// if(confirm("승인완료된 인시던트입니다.\n수정하면 모든 승인 정보는 초기화 됩니다.\n수정하시겠습니까?") == false) return;
|
||||
alert("승인완료된 인시던트입니다.\n 재작성하시길 바랍니다.");
|
||||
return;
|
||||
|
||||
}
|
||||
@ -130,13 +130,13 @@
|
||||
|
||||
//----------------------------------------
|
||||
// 2025.01.21 나혁제 새로만들 기능확장
|
||||
// 서비스 새로만들기 화면 이동처리
|
||||
// 인스던트 새로만들기 화면 이동처리
|
||||
// ----------------------------------------
|
||||
function fncSvcDeskIncidentCopyInsert()
|
||||
{
|
||||
if($('#inIncidentStatus').val() != '2' && $('#inIncidentStatus').val() != '3' )
|
||||
{
|
||||
alert("[승인완료/반려]된 서비스에서만 새로만들기가 가능합니다.");
|
||||
alert("[승인완료/반려]된 인시던트에서만 새로만들기가 가능합니다.");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -148,18 +148,18 @@
|
||||
|
||||
|
||||
//----------------------------------------
|
||||
// 서비스 삭제 처리
|
||||
// 인스던트 삭제 처리
|
||||
// ----------------------------------------
|
||||
function fncSvcDeskIncidentDelete()
|
||||
{
|
||||
// 2025.11.18 나혁제 [승인완료/반려] 삭제 불가
|
||||
if($('#inIncidentStatus').val() == '2' || $('#inIncidentStatus').val() == '3' )
|
||||
{
|
||||
alert("[승인완료/반려] 상태의 서비스는 삭제가 불가합니다.");
|
||||
alert("[승인완료/반려] 상태의 인시던트는 삭제가 불가합니다.");
|
||||
return;
|
||||
}
|
||||
|
||||
var bYes = confirm("서비스 삭제 처리를 하시겠습니까?");
|
||||
var bYes = confirm("인스던트 삭제 처리를 하시겠습니까?");
|
||||
if(bYes==false) return;
|
||||
|
||||
proc.fn_IncidentDelete_save();
|
||||
@ -171,7 +171,7 @@
|
||||
// ----------------------------------------
|
||||
function fncSvcDeskIncidentCompleted()
|
||||
{
|
||||
var bYes = confirm("서비스 처리완료 처리를 하시겠습니까?");
|
||||
var bYes = confirm("인스던트 처리완료 처리를 하시겠습니까?");
|
||||
if(bYes==false) return;
|
||||
|
||||
// 처리완료 메세지 팝업 open
|
||||
@ -195,7 +195,7 @@
|
||||
// ----------------------------------------
|
||||
function fncSvcDeskIncidentReqApp()
|
||||
{
|
||||
var bYes = confirm("서비스 승인요청 처리를 하시겠습니까?");
|
||||
var bYes = confirm("인스던트 승인요청 처리를 하시겠습니까?");
|
||||
if(bYes==false) return;
|
||||
|
||||
// 승인요청 메세지 팝업 open
|
||||
@ -203,7 +203,7 @@
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 서비스 승인요청 처리(최종 저장 처리 )
|
||||
// 인스던트 승인요청 처리(최종 저장 처리 )
|
||||
// ----------------------------------------
|
||||
function fncAppLast(strMsg)
|
||||
{
|
||||
@ -218,7 +218,7 @@
|
||||
// ----------------------------------------
|
||||
function fncSvcDeskIncidentAppRej()
|
||||
{
|
||||
var bYes = confirm("서비스 승인/반려 처리를 하시겠습니까?");
|
||||
var bYes = confirm("인스던트 승인/반려 처리를 하시겠습니까?");
|
||||
if(bYes==false) return;
|
||||
|
||||
// 승인&반려 메세지 팝업 open
|
||||
@ -226,7 +226,7 @@
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 서비스 변경/승인 처리(최종 저장 처리 )
|
||||
// 인스던트 변경/승인 처리(최종 저장 처리 )
|
||||
// ----------------------------------------
|
||||
// 2025.11.17 나혁제 strStsfdgCd 만족도 추가
|
||||
function fncAppRejLast(strGubun , strMsg, strStsfdgCd)
|
||||
@ -374,7 +374,7 @@
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 서비스 댓글 등록
|
||||
// 인스던트 댓글 등록
|
||||
// ----------------------------------------
|
||||
function fn_egov_insert_commentList(bbsId, nttId)
|
||||
{
|
||||
@ -396,7 +396,7 @@
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 서비스 댓글 삭제
|
||||
// 인스던트 댓글 삭제
|
||||
// ----------------------------------------
|
||||
function fn_egov_deleteCommentList(commentNo, bbsId, nttId)
|
||||
{
|
||||
@ -416,7 +416,7 @@
|
||||
// 서블릿 통신
|
||||
var proc =
|
||||
{
|
||||
// 서비스 처리완료
|
||||
// 인스던트 처리완료
|
||||
fn_completedIncident_save : function ()
|
||||
{
|
||||
var form = $('#svcDeskManage')[0];
|
||||
@ -438,13 +438,13 @@
|
||||
},
|
||||
error: function(errorThrown)
|
||||
{
|
||||
alert("서비스 처리완료중 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
|
||||
alert("인스던트 처리완료중 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
|
||||
console.log(JSON.stringify(errorThrown));
|
||||
}
|
||||
});
|
||||
}
|
||||
,
|
||||
// 서비스 승인요청
|
||||
// 인스던트 승인요청
|
||||
fn_IncidentReqApp_save : function ()
|
||||
{
|
||||
var form = $('#svcDeskManage')[0];
|
||||
@ -466,13 +466,13 @@
|
||||
},
|
||||
error: function(errorThrown)
|
||||
{
|
||||
alert("서비스 승인요청중 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
|
||||
alert("인스던트 승인요청중 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
|
||||
console.log(JSON.stringify(errorThrown));
|
||||
}
|
||||
});
|
||||
}
|
||||
,
|
||||
// 서비스 삭제
|
||||
// 인스던트 삭제
|
||||
fn_IncidentDelete_save : function ()
|
||||
{
|
||||
var form = $('#svcDeskManage')[0];
|
||||
@ -489,18 +489,18 @@
|
||||
, cache:false
|
||||
, success: function(data)
|
||||
{
|
||||
alert("서비스 삭제 되었습니다.");
|
||||
alert("인스던트 삭제 되었습니다.");
|
||||
fncSvcDeskList();
|
||||
},
|
||||
error: function(errorThrown)
|
||||
{
|
||||
alert("서비스 삭제중 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
|
||||
alert("인스던트 삭제중 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
|
||||
console.log(JSON.stringify(errorThrown));
|
||||
}
|
||||
});
|
||||
}
|
||||
,
|
||||
// 서비스 승인
|
||||
// 인스던트 승인
|
||||
fn_Incident_Approval : function ()
|
||||
{
|
||||
var form = $('#svcDeskManage')[0];
|
||||
@ -517,18 +517,18 @@
|
||||
, cache:false
|
||||
, success: function(data)
|
||||
{
|
||||
alert("서비스 승인 되었습니다.");
|
||||
alert("인스던트 승인 되었습니다.");
|
||||
fncSvcDeskList();
|
||||
},
|
||||
error: function(errorThrown)
|
||||
{
|
||||
alert("서비스 승인중 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
|
||||
alert("인스던트 승인중 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
|
||||
console.log(JSON.stringify(errorThrown));
|
||||
}
|
||||
});
|
||||
}
|
||||
,
|
||||
// 서비스 반려
|
||||
// 인스던트 반려
|
||||
fn_Incident_Reject : function ()
|
||||
{
|
||||
var form = $('#svcDeskManage')[0];
|
||||
@ -545,12 +545,12 @@
|
||||
, cache:false
|
||||
, success: function(data)
|
||||
{
|
||||
alert("서비스 반려 되었습니다.");
|
||||
alert("인스던트 반려 되었습니다.");
|
||||
fncSvcDeskList();
|
||||
},
|
||||
error: function(errorThrown)
|
||||
{
|
||||
alert("서비스 반려중 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
|
||||
alert("인스던트 반려중 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
|
||||
console.log(JSON.stringify(errorThrown));
|
||||
}
|
||||
});
|
||||
@ -639,7 +639,7 @@
|
||||
<!-- main title -->
|
||||
<div class="main_titWrap">
|
||||
|
||||
<h3>서비스 상세조회</h3>
|
||||
<h3>인스던트 상세조회</h3>
|
||||
|
||||
<!-- location :s -->
|
||||
<div class="location">
|
||||
@ -648,7 +648,7 @@
|
||||
<ul class="route_navi">
|
||||
<li><a href="#" title="홈"><span class="home">홈</span></a></li>
|
||||
<li><a href="#" title="SR관리">SR관리</a></li>
|
||||
<li>서비스 상세조회</li>
|
||||
<li>인스던트 상세조회</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -30,7 +30,7 @@
|
||||
<%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %>
|
||||
|
||||
|
||||
<title> 서비스 등록 </title>
|
||||
<title> 인스던트 등록 </title>
|
||||
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
|
||||
@ -251,7 +251,7 @@ ${uploadMax }
|
||||
// ----------------------------------------
|
||||
function fncSvcDeskIncidentInsert()
|
||||
{
|
||||
var bYes = confirm("서비스 접수 처리를 하시겠습니까?");
|
||||
var bYes = confirm("인스던트 접수 처리를 하시겠습니까?");
|
||||
if(bYes==false) return;
|
||||
|
||||
var form = document.svcDeskManage;
|
||||
@ -287,7 +287,7 @@ ${uploadMax }
|
||||
// ----------------------------------------
|
||||
function fncSvcDeskIncidentInsertReqApp()
|
||||
{
|
||||
var bYes = confirm("서비스 등록/승인요청 처리를 하시겠습니까?");
|
||||
var bYes = confirm("인스던트 등록/승인요청 처리를 하시겠습니까?");
|
||||
if(bYes==false) return;
|
||||
|
||||
var form = document.svcDeskManage;
|
||||
@ -320,7 +320,7 @@ ${uploadMax }
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 서비스 변경/승인처리 처리(최종 저장 처리 )
|
||||
// 인스던트 변경/승인처리 처리(최종 저장 처리 )
|
||||
// ----------------------------------------
|
||||
function fncAppLast(strMsg)
|
||||
{
|
||||
@ -451,7 +451,7 @@ ${uploadMax }
|
||||
// ----------------------------------------
|
||||
var proc =
|
||||
{
|
||||
// 서비스 접수
|
||||
// 인스던트 접수
|
||||
fn_incident_save : function ()
|
||||
{
|
||||
var form = $('#svcDeskManage')[0];
|
||||
@ -466,21 +466,15 @@ ${uploadMax }
|
||||
, processData:false
|
||||
, contentType:false
|
||||
, cache:false
|
||||
, success: function(data)
|
||||
, success: function(data)
|
||||
{
|
||||
// 2026.07.19 SR#12 : 서버 검증 실패(길이초과 등) 시 안내 메시지 노출 후 등록 중단
|
||||
if(data.resultCd != "0")
|
||||
{
|
||||
alert(data.resultMsg);
|
||||
return;
|
||||
}
|
||||
alert("등록 완료 되었습니다.");
|
||||
fncSvcDeskList();
|
||||
|
||||
|
||||
},
|
||||
error: function(errorThrown)
|
||||
error: function(errorThrown)
|
||||
{
|
||||
alert("서비스 접수 등록중 오류가 발생하였습니다. \n 시스템관리자에게 문의해 주시기 바랍니다.");
|
||||
alert("인스던트 접수 등록중 오류가 발생하였습니다. \n 시스템관리자에게 문의해 주시기 바랍니다.");
|
||||
console.log(JSON.stringify(errorThrown));
|
||||
}
|
||||
});
|
||||
@ -622,7 +616,7 @@ ${uploadMax }
|
||||
<ul class="route_navi">
|
||||
<li><a href="#" title="홈"><span class="home">홈</span></a></li>
|
||||
<li><a href="#" title="SR관리">SR관리</a></li>
|
||||
<li>서비스 접수</li>
|
||||
<li>인스던트 접수</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@ -637,7 +631,7 @@ ${uploadMax }
|
||||
|
||||
<!-- 등록폼 -->
|
||||
<table class="tbl_form" summary="<spring:message code="common.summary.list" arguments="등록" />">
|
||||
<caption>서비스 등록</caption>
|
||||
<caption>인스던트 등록</caption>
|
||||
<colgroup>
|
||||
<col style="width: 10%;">
|
||||
<col style="width: 30%">
|
||||
@ -693,7 +687,7 @@ ${uploadMax }
|
||||
<tr>
|
||||
<th> 제목 </th>
|
||||
<td colspan=3>
|
||||
<input type="text" name="vcIncidentTitle" id="vcIncidentTitle" value="" style="width:90%;" maxlength="200"/><!-- 2026.07.19 SR#12 제목 길이 제한 -->
|
||||
<input type="text" name="vcIncidentTitle" id="vcIncidentTitle" value="" style="width:90%;"/>
|
||||
</td>
|
||||
<th> 조치자 </th>
|
||||
<td>
|
||||
@ -814,8 +808,8 @@ ${uploadMax }
|
||||
<button type="button" class="btn-etc" title="등록/승인요청" onclick="fncSvcDeskIncidentInsertReqApp(); return false;">
|
||||
등록/승인요청
|
||||
</button>
|
||||
<button type="button" class="btn-etc" title="임시저장" onclick="fncSvcDeskIncidentInsert(); return false;">
|
||||
임시저장
|
||||
<button type="button" class="btn-etc" title="<spring:message code="button.create" />" onclick="fncSvcDeskIncidentInsert(); return false;">
|
||||
<spring:message code="button.create" />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -233,7 +233,7 @@
|
||||
|
||||
<!-- 목록영역 -->
|
||||
<table class="table" summary="<spring:message code="common.summary.list" arguments="자산관리" />">
|
||||
<caption> 서비스데스크 서비스 관리 <spring:message code="title.list" /></caption>
|
||||
<caption> 서비스데스크 인스던트 관리 <spring:message code="title.list" /></caption>
|
||||
<colgroup>
|
||||
<col style="width: 15%;">
|
||||
<col style="width: 10%;">
|
||||
|
||||
@ -30,7 +30,7 @@
|
||||
<%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %>
|
||||
|
||||
|
||||
<title> 서비스 신청 </title>
|
||||
<title> 인스던트 신청 </title>
|
||||
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
|
||||
@ -86,7 +86,7 @@
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 서비스 신청 수정 화면 이동처리
|
||||
// 인스던트 신청 수정 화면 이동처리
|
||||
// ----------------------------------------
|
||||
function fncSvcDeskReqIncidentUpdate()
|
||||
{
|
||||
@ -97,18 +97,18 @@
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 서비스 삭제 처리
|
||||
// 인스던트 삭제 처리
|
||||
// ----------------------------------------
|
||||
function fncSvcDeskReqIncidentDelete()
|
||||
{
|
||||
// 2025.11.18 나혁제 [승인완료/반려] 삭제 불가
|
||||
if($('#inReqStatus').val() != '-1' )
|
||||
{
|
||||
alert("신청상태 이외의 서비스 신청정보는 삭제가 불가합니다.");
|
||||
alert("신청상태 이외의 인시던트 신청정보는 삭제가 불가합니다.");
|
||||
return;
|
||||
}
|
||||
|
||||
var bYes = confirm("서비스 신청정보 삭제 처리를 하시겠습니까?");
|
||||
var bYes = confirm("인스던트 신청정보 삭제 처리를 하시겠습니까?");
|
||||
if(bYes==false) return;
|
||||
|
||||
proc.fn_ReqIncidentDelete_save();
|
||||
@ -119,7 +119,7 @@
|
||||
// ----------------------------------------
|
||||
function fncSvcDeskReqIncidentRptRej()
|
||||
{
|
||||
var bYes = confirm("서비스 접수/반려 처리를 하시겠습니까?");
|
||||
var bYes = confirm("인스던트 접수/반려 처리를 하시겠습니까?");
|
||||
if(bYes==false) return;
|
||||
|
||||
// 승인&반려 메세지 팝업 open
|
||||
@ -127,7 +127,7 @@
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 서비스 접수/반려 처리(최종 저장 처리 )
|
||||
// 인스던트 접수/반려 처리(최종 저장 처리 )
|
||||
// ----------------------------------------
|
||||
function fncRptRejLast(strGubun , strMsg)
|
||||
{
|
||||
@ -136,7 +136,7 @@
|
||||
// 접수처리
|
||||
if(strGubun=='0')
|
||||
{
|
||||
// 서비스 접수 화면으로 이동처리
|
||||
// 인스던트 접수 화면으로 이동처리
|
||||
var varFrom = document.getElementById("svcDeskReqManage");
|
||||
varFrom.action = "<c:url value='/srm/insertViewIncident.do'/>";
|
||||
varFrom.submit();
|
||||
@ -192,7 +192,7 @@
|
||||
// ----------------------------------------
|
||||
var proc =
|
||||
{
|
||||
// 서비스 삭제
|
||||
// 인스던트 삭제
|
||||
fn_ReqIncidentDelete_save : function ()
|
||||
{
|
||||
var form = $('#svcDeskReqManage')[0];
|
||||
@ -209,17 +209,17 @@
|
||||
, cache:false
|
||||
, success: function(data)
|
||||
{
|
||||
alert("서비스 신청정보 삭제 되었습니다.");
|
||||
alert("인스던트 신청정보 삭제 되었습니다.");
|
||||
fncSvcDeskReqList();
|
||||
},
|
||||
error: function(errorThrown)
|
||||
{
|
||||
alert("서비스 신청정보 삭제처리중 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
|
||||
alert("인스던트 신청정보 삭제처리중 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
|
||||
console.log(JSON.stringify(errorThrown));
|
||||
}
|
||||
});
|
||||
}
|
||||
// 서비스 신청정보 반려
|
||||
// 인스던트 신청정보 반려
|
||||
, fn_Incident_Req_Reject : function ()
|
||||
{
|
||||
var form = $('#svcDeskReqManage')[0];
|
||||
@ -236,12 +236,12 @@
|
||||
, cache:false
|
||||
, success: function(data)
|
||||
{
|
||||
alert("서비스 신청정보 반려 되었습니다.");
|
||||
alert("인스던트 신청정보 반려 되었습니다.");
|
||||
fncSvcDeskReqList();
|
||||
},
|
||||
error: function(errorThrown)
|
||||
{
|
||||
alert("서비스 신청정보 반려중 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
|
||||
alert("인스던트 신청정보 반려중 오류가 발생하였습니다. \n 시스템 관리자에게 문의해 주시기 바랍니다.");
|
||||
console.log(JSON.stringify(errorThrown));
|
||||
}
|
||||
});
|
||||
@ -272,7 +272,7 @@
|
||||
<ul class="route_navi">
|
||||
<li><a href="#" title="홈"><span class="home">홈</span></a></li>
|
||||
<li><a href="#" title="SR관리">SR관리</a></li>
|
||||
<li>서비스 신청 상세조회</li>
|
||||
<li>인스던트 신청 상세조회</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@ -287,7 +287,7 @@
|
||||
|
||||
<!-- 등록폼 -->
|
||||
<table class="tbl_form" summary="<spring:message code="common.summary.list" arguments="등록" />">
|
||||
<caption>서비스 등록</caption>
|
||||
<caption>인스던트 등록</caption>
|
||||
<colgroup>
|
||||
<col style="width: 10%;">
|
||||
<col style="width: 30%">
|
||||
@ -337,7 +337,7 @@
|
||||
<div class="bbs_view">
|
||||
<!-- 등록폼 -->
|
||||
<table class="tbl_form" summary="<spring:message code="common.summary.list" arguments="등록" />">
|
||||
<caption>서비스 등록</caption>
|
||||
<caption>인스던트 등록</caption>
|
||||
<colgroup>
|
||||
<col style="width: 10%;">
|
||||
<col style="width: 14%">
|
||||
|
||||
@ -30,7 +30,7 @@
|
||||
<%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %>
|
||||
|
||||
|
||||
<title> 서비스 신청 </title>
|
||||
<title> 인스던트 신청 </title>
|
||||
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
|
||||
@ -148,7 +148,7 @@
|
||||
// ----------------------------------------
|
||||
function fncSvcDeskReqIncidentInsert()
|
||||
{
|
||||
var bYes = confirm("서비스 신청 처리를 하시겠습니까?");
|
||||
var bYes = confirm("인스던트 신청 처리를 하시겠습니까?");
|
||||
if(bYes==false) return;
|
||||
|
||||
var form = document.svcDeskReqManage;
|
||||
@ -233,7 +233,7 @@
|
||||
// ----------------------------------------
|
||||
var proc =
|
||||
{
|
||||
// 서비스 신청 등록
|
||||
// 인스던트 신청 등록
|
||||
fn_req_incident_save : function ()
|
||||
{
|
||||
var form = $('#svcDeskReqManage')[0];
|
||||
@ -248,21 +248,15 @@
|
||||
, processData:false
|
||||
, contentType:false
|
||||
, cache:false
|
||||
, success: function(data)
|
||||
, success: function(data)
|
||||
{
|
||||
// 2026.07.19 SR#12 : 서버 검증 실패(길이초과 등) 시 안내 후 신청 중단
|
||||
if(data.resultCd != "0")
|
||||
{
|
||||
alert(data.resultMsg);
|
||||
return;
|
||||
}
|
||||
alert("신청 완료 되었습니다.");
|
||||
fncSvcDeskReqList();
|
||||
|
||||
|
||||
},
|
||||
error: function(errorThrown)
|
||||
{
|
||||
alert("서비스 신청 등록중 오류가 발생하였습니다. \n 시스템관리자에게 문의해 주시기 바랍니다.");
|
||||
alert("인스던트 신청 등록중 오류가 발생하였습니다. \n 시스템관리자에게 문의해 주시기 바랍니다.");
|
||||
console.log(JSON.stringify(errorThrown));
|
||||
}
|
||||
});
|
||||
@ -329,7 +323,7 @@
|
||||
<ul class="route_navi">
|
||||
<li><a href="#" title="홈"><span class="home">홈</span></a></li>
|
||||
<li><a href="#" title="SR관리">SR관리</a></li>
|
||||
<li>서비스 신청</li>
|
||||
<li>인스던트 신청</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@ -344,7 +338,7 @@
|
||||
|
||||
<!-- 등록폼 -->
|
||||
<table class="tbl_form" summary="<spring:message code="common.summary.list" arguments="등록" />">
|
||||
<caption>서비스 등록</caption>
|
||||
<caption>인스던트 등록</caption>
|
||||
<colgroup>
|
||||
<col style="width: 10%;">
|
||||
<col style="width: 30%">
|
||||
@ -377,31 +371,22 @@
|
||||
<tr>
|
||||
<th> 서비스 </th>
|
||||
<td>
|
||||
<!-- 2026.07.19 기능개선03/F03 : 서비스신청 시 서비스 항목은 'SR기본요청양식'으로 고정(사용자 선택 불가) -->
|
||||
<select name="inServiceCode" id="inServiceCode" onchange="selInServiceCode()" style="width: 80%;" >
|
||||
<c:forEach items="${serviceList}" var="result" varStatus="status">
|
||||
<option value="${result.value}" > ${result.label} </option><!-- 분류코드명 -->
|
||||
</c:forEach>
|
||||
</select>
|
||||
<script type="text/javascript">
|
||||
// F03 : 'SR기본요청양식' 옵션을 기본 선택하고 변경 불가 처리(값은 정상 제출)
|
||||
$(function(){
|
||||
var $s = $('#inServiceCode');
|
||||
$s.find('option').each(function(){
|
||||
if($.trim($(this).text()) == 'SR기본요청양식'){ $s.val($(this).val()); return false; }
|
||||
});
|
||||
$s.css({'pointer-events':'none','background-color':'#f2f2f2'}).attr('tabindex','-1');
|
||||
});
|
||||
</script>
|
||||
</td>
|
||||
<th> 조치예정자 </th>
|
||||
<td>
|
||||
<!-- 2026.07.19 SR#9-1 : 신청 시 조치예정자는 서비스 선택에 따라 자동배정, 사용자 직접 선택(돋보기) 제거 -->
|
||||
<input type="text" name="vcChargeUser" id="vcChargeUser" style="width: 60%;" readonly value=""/>
|
||||
<span style="color:#888;">(자동배정)</span>
|
||||
|
||||
<input type="text" name="vcChargeUser" id="vcChargeUser" style="width: 90%;" readonly value=""/>
|
||||
|
||||
<a href="<c:url value='/cmm/selectUserListPopup.do' />" target="_blank" title="새 창으로 이동" onclick="fn_User_Search('조치예정', 'inChargeUser', '', 'vcChargeUser', '', '');return false;">
|
||||
<img src="<c:url value='/egov/images/egovframework/com/cmm/btn/btn_search.gif' />" alt="조치예정자 검색" title="조치예정자 검색">
|
||||
</a>
|
||||
|
||||
<input type="hidden" name="inChargeUser" id="inChargeUser" value="" >
|
||||
|
||||
|
||||
</td>
|
||||
<th> 완료요청일시 </th>
|
||||
<td>
|
||||
@ -412,7 +397,7 @@
|
||||
<tr>
|
||||
<th> 제목 </th>
|
||||
<td colspan=2>
|
||||
<input type="text" name="vcIncidentTitle" id="vcIncidentTitle" value="" style="width:90%;" maxlength="200"/><!-- 2026.07.19 SR#12 제목 길이 제한 -->
|
||||
<input type="text" name="vcIncidentTitle" id="vcIncidentTitle" value="" style="width:90%;"/>
|
||||
</td>
|
||||
|
||||
<th><spring:message code="cop.atchFile" /></th>
|
||||
|
||||
@ -135,7 +135,7 @@
|
||||
|
||||
<!-- 목록영역 -->
|
||||
<table class="table" summary="<spring:message code="common.summary.list" arguments="자산관리" />">
|
||||
<caption> 서비스데스크 서비스 관리 <spring:message code="title.list" /></caption>
|
||||
<caption> 서비스데스크 인스던트 관리 <spring:message code="title.list" /></caption>
|
||||
<colgroup>
|
||||
<col style="width: 16%;">
|
||||
<col style="width: 16%;">
|
||||
|
||||
@ -30,7 +30,7 @@
|
||||
<%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %>
|
||||
|
||||
|
||||
<title> 서비스 신청 수정 </title>
|
||||
<title> 인스던트 신청 수정 </title>
|
||||
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
|
||||
@ -144,11 +144,11 @@
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 서비스 변경처리
|
||||
// 인스던트 변경처리
|
||||
// ----------------------------------------
|
||||
function fncSvcDeskReqIncidentUpdate()
|
||||
{
|
||||
var bYes = confirm("서비스 신청 변경 처리를 하시겠습니까?");
|
||||
var bYes = confirm("인스던트 신청 변경 처리를 하시겠습니까?");
|
||||
if(bYes==false) return;
|
||||
|
||||
var form = document.svcDeskReqManage;
|
||||
@ -267,7 +267,7 @@
|
||||
},
|
||||
error: function(errorThrown)
|
||||
{
|
||||
alert("서비스 신청 정보 수정 처리중 오류가 발생 하였습니다. \n 시스템 관리자에게 연락바랍니다.");
|
||||
alert("인스던트 신청 정보 수정 처리중 오류가 발생 하였습니다. \n 시스템 관리자에게 연락바랍니다.");
|
||||
|
||||
console.log(JSON.stringify(errorThrown));
|
||||
}
|
||||
@ -335,7 +335,7 @@
|
||||
<ul class="route_navi">
|
||||
<li><a href="#" title="홈"><span class="home">홈</span></a></li>
|
||||
<li><a href="#" title="SR관리">SR관리</a></li>
|
||||
<li>서비스 신청</li>
|
||||
<li>인스던트 신청</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@ -350,7 +350,7 @@
|
||||
|
||||
<!-- 등록폼 -->
|
||||
<table class="tbl_form" summary="<spring:message code="common.summary.list" arguments="등록" />">
|
||||
<caption>서비스 등록</caption>
|
||||
<caption>인스던트 등록</caption>
|
||||
<colgroup>
|
||||
<col style="width: 10%;">
|
||||
<col style="width: 30%">
|
||||
|
||||
@ -30,7 +30,7 @@
|
||||
<%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %>
|
||||
|
||||
|
||||
<title> 서비스 수정 </title>
|
||||
<title> 인스던트 수정 </title>
|
||||
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
|
||||
@ -224,11 +224,11 @@
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 서비스 변경처리
|
||||
// 인스던트 변경처리
|
||||
// ----------------------------------------
|
||||
function fncSvcDeskIncidentUpdate()
|
||||
{
|
||||
var bYes = confirm("서비스 변경 처리를 하시겠습니까?");
|
||||
var bYes = confirm("인스던트 변경 처리를 하시겠습니까?");
|
||||
if(bYes==false) return;
|
||||
|
||||
var form = document.svcDeskManage;
|
||||
@ -260,11 +260,11 @@
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 서비스 변경/승인처리 처리
|
||||
// 인스던트 변경/승인처리 처리
|
||||
// ----------------------------------------
|
||||
function fncSvcDeskIncidentUpdateApp()
|
||||
{
|
||||
var bYes = confirm("서비스 변경/승인요청 처리를 하시겠습니까?");
|
||||
var bYes = confirm("인스던트 변경/승인요청 처리를 하시겠습니까?");
|
||||
if(bYes==false) return;
|
||||
|
||||
var form = document.svcDeskManage;
|
||||
@ -332,7 +332,7 @@
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 서비스 변경/승인처리 처리(최종 저장 처리 )
|
||||
// 인스던트 변경/승인처리 처리(최종 저장 처리 )
|
||||
// ----------------------------------------
|
||||
function fncAppLast(strMsg)
|
||||
{
|
||||
@ -496,7 +496,7 @@
|
||||
},
|
||||
error: function(errorThrown)
|
||||
{
|
||||
alert("서비스 정보 수정 처리중 오류가 발생 하였습니다. \n 시스템 관리자에게 연락바랍니다.");
|
||||
alert("인스던트 정보 수정 처리중 오류가 발생 하였습니다. \n 시스템 관리자에게 연락바랍니다.");
|
||||
|
||||
console.log(JSON.stringify(errorThrown));
|
||||
}
|
||||
@ -627,7 +627,7 @@
|
||||
<!-- main title -->
|
||||
<div class="main_titWrap">
|
||||
|
||||
<h3>서비스 수정</h3>
|
||||
<h3>인스던트 수정</h3>
|
||||
|
||||
<!-- location :s -->
|
||||
<div class="location">
|
||||
@ -636,7 +636,7 @@
|
||||
<ul class="route_navi">
|
||||
<li><a href="#" title="홈"><span class="home">홈</span></a></li>
|
||||
<li><a href="#" title="SR관리">SR관리</a></li>
|
||||
<li>서비스 수정</li>
|
||||
<li>인스던트 수정</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -372,8 +372,7 @@
|
||||
<c:if test="${!empty authorGroupVO.pageIndex }">
|
||||
<!-- paging navigation -->
|
||||
<div class="pagination">
|
||||
<%-- 2026.07.19 장애처리04/D04 : 페이지 이동 시 검색조건 유지 (미정의 fn_egov_select_linkPage → listForm 재제출 linkPage 로 교정) --%>
|
||||
<ul><ui:pagination paginationInfo="${paginationInfo}" type="image" jsFunction="linkPage"/></ul>
|
||||
<ul><ui:pagination paginationInfo="${paginationInfo}" type="image" jsFunction="fn_egov_select_linkPage"/></ul>
|
||||
</div>
|
||||
</c:if>
|
||||
|
||||
|
||||
@ -433,17 +433,6 @@
|
||||
<form:options items="${groupId_result}" itemValue="code" itemLabel="codeNm"/>
|
||||
</form:select>
|
||||
<div><form:errors path="groupId" cssClass="error"/></div>
|
||||
<script type="text/javascript">
|
||||
// 2026.07.19 기능개선05/F05 : 그룹아이디 미선택 시 기본값 'KIC' 자동 선택
|
||||
$(function(){
|
||||
var $g = $('#groupId');
|
||||
if($g.length > 0 && ($g.val() == null || $g.val() == '')){
|
||||
$g.find('option').each(function(){
|
||||
if($.trim($(this).text()) == 'KIC'){ $g.val($(this).val()); return false; }
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
||||
@ -1,320 +1,320 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
|
||||
<%--
|
||||
Class Name : LoginUsr.jsp
|
||||
Description : 로그인화면
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2025.01.03 나혁제 최초생성
|
||||
|
||||
author : 인프라본부 나혁제
|
||||
since : 2025.01.02
|
||||
--%>
|
||||
<%@ 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="form" uri="http://www.springframework.org/tags/form" %>
|
||||
|
||||
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
|
||||
|
||||
<title> UR-ITSM </title>
|
||||
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>urITSM</title>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<meta name="keywords" content="uWorks Portal">
|
||||
<meta name="description" content="uWorks Portal에 오신것을 환영합니다.">
|
||||
<link rel="stylesheet" type="text/css" href="${ctx}/css/import.css">
|
||||
<script type="text/javascript" src="${ctx}/js/jquery-2.2.4.min.js"></script>
|
||||
|
||||
<script type="text/javascript" src="${ctx}/js/common_script.js"></script>
|
||||
<link rel="stylesheet" href="${ctx}/js/js-calendar/calendar-jquery-ui.css">
|
||||
|
||||
<script type="text/javascript" src="${ctx}/js/js-calendar/jquery.js"></script>
|
||||
<script type="text/javascript" src="${ctx}/js/js-calendar/jquery-ui.js"></script>
|
||||
<script type="text/javascript" src="${ctx}/js/js-calendar/calendar.js"></script>
|
||||
|
||||
</head>
|
||||
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
//----------------------------------------
|
||||
// 화면 초기화
|
||||
// ----------------------------------------
|
||||
$(document).ready(function()
|
||||
{
|
||||
var strCookieLoginId = getCookie("saveId");
|
||||
|
||||
if(strCookieLoginId != '')
|
||||
{
|
||||
$("#remember_id").prop("checked", true);
|
||||
}
|
||||
else
|
||||
{
|
||||
$("#remember_id").prop("checked", false);
|
||||
}
|
||||
|
||||
$("#userId").val(strCookieLoginId);
|
||||
|
||||
$("#userId, #password").keydown(function(e) {
|
||||
|
||||
if (e.key === "Enter")
|
||||
{
|
||||
actionLogin();
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
function actionLogin()
|
||||
{
|
||||
if (document.loginForm.userId.value =="")
|
||||
{
|
||||
alert("아이디를 입력하세요");
|
||||
return false;
|
||||
}
|
||||
else if (document.loginForm.password.value =="")
|
||||
{
|
||||
alert("비밀번호를 입력하세요");
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 체크 시 쿠키에 ID 저장
|
||||
if($("#remember_id").prop("checked"))
|
||||
{
|
||||
setCookie("saveId", $("#userId").val(), 7); // 7일간 ID 저장
|
||||
}
|
||||
// 체크 해제 시 쿠키에서 ID 삭제
|
||||
else
|
||||
{
|
||||
deleteCookie("saveId");
|
||||
}
|
||||
|
||||
// document.loginForm.action="<c:url value='/main/actionSecurityLogin.do'/>";
|
||||
document.loginForm.action="/";
|
||||
document.loginForm.submit();
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 쿠키 조회
|
||||
// ----------------------------------------
|
||||
function getCookie(name)
|
||||
{
|
||||
const cookie = document.cookie;
|
||||
|
||||
if (document.cookie != "")
|
||||
{
|
||||
var cookieArray = cookie.split("; ");
|
||||
for ( var index in cookieArray)
|
||||
{
|
||||
var cookieName = cookieArray[index].split("=");
|
||||
if (cookieName[0] == name)
|
||||
{
|
||||
return cookieName[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
return "" ;
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 쿠키 설정
|
||||
// ----------------------------------------
|
||||
function setCookie(name,value,expiredays)
|
||||
{
|
||||
const date = new Date();
|
||||
date.setDate(date.getDate() + expiredays);
|
||||
document.cookie = escape(name) + "=" + escape(value) + "; path=/; expires=" + date.toUTCString();
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 쿠키 삭제
|
||||
// ----------------------------------------
|
||||
function deleteCookie(name)
|
||||
{
|
||||
const expireDate = new Date();
|
||||
expireDate.setDate(expireDate.getDate() - 1);
|
||||
document.cookie = name + "= " + "; expires=" + expireDate.toGMTString();
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 2026.01.14 나혁제 추가
|
||||
// ID 찾기
|
||||
// ----------------------------------------
|
||||
function fncIdFindOpen()
|
||||
{
|
||||
PopupOpen("/main/PopIdFind", 470, 450, '');
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 2026.01.14 나혁제 추가
|
||||
// 패스워드 초기화
|
||||
// ----------------------------------------
|
||||
function fncPopPassworkdResetOpen()
|
||||
{
|
||||
PopupOpen("/main/PopPasswordReset", 380, 450, '');
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 2026.01.19 나혁제 추가
|
||||
// 패스워드 초기화
|
||||
// ----------------------------------------
|
||||
function fncPopUserRegistOpen()
|
||||
{
|
||||
// PopupOpen("/main/PopUserRegist", 380, 800, '');
|
||||
|
||||
var $dialog = $('<div></div>')
|
||||
.html('<iframe style="border: 0px; " src="/main/noAuthUserInsertView.do" width="100%" height="100%"></iframe>')
|
||||
.dialog({
|
||||
autoOpen: false
|
||||
, modal: true
|
||||
, height: 600
|
||||
, width: 800
|
||||
, title: '회원가입'
|
||||
, open: function (event, ui)
|
||||
{
|
||||
$(".ui-icon-closethick").remove(); // 닫기 버튼 제거
|
||||
$('.ui-dialog-titlebar-close').css({
|
||||
width: '30px' // 닫기 버튼 너비
|
||||
// , height: '50px' // 닫기 버튼 높이
|
||||
});
|
||||
$(this).parent().find(".ui-dialog-titlebar").hide(); // 타이틀바 안보이게 처리
|
||||
}
|
||||
|
||||
, closeText: '닫기'
|
||||
});
|
||||
|
||||
$dialog.dialog('open');
|
||||
|
||||
// 팝업 화면 맨앞으로 배치
|
||||
$(".ui-dialog").css("z-index", "99");
|
||||
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 팝업 오픈
|
||||
// ----------------------------------------
|
||||
function PopupOpen(strUrl, hei, wid, pagetitle)
|
||||
{
|
||||
var page = "/common/PageRedirection.do?Page="+ strUrl
|
||||
+ "&PopupYn=B";
|
||||
|
||||
var $dialog = $('<div></div>')
|
||||
.html('<iframe style="border: 0px; " src="' + page + '" width="100%" height="100%"></iframe>')
|
||||
.dialog({
|
||||
autoOpen: false
|
||||
, modal: true
|
||||
, height: hei
|
||||
, width: wid
|
||||
, title: pagetitle
|
||||
, open: function (event, ui)
|
||||
{
|
||||
$(".ui-icon-closethick").remove(); // 닫기 버튼 제거
|
||||
$('.ui-dialog-titlebar-close').css({
|
||||
width: '30px' // 닫기 버튼 너비
|
||||
// , height: '50px' // 닫기 버튼 높이
|
||||
});
|
||||
$(this).parent().find(".ui-dialog-titlebar").hide(); // 타이틀바 안보이게 처리
|
||||
}
|
||||
|
||||
, closeText: '닫기'
|
||||
});
|
||||
|
||||
$dialog.dialog('open');
|
||||
|
||||
// 팝업 화면 맨앞으로 배치
|
||||
$(".ui-dialog").css("z-index", "99");
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
$("#userId").keypress(function(e)
|
||||
{
|
||||
alert(e.keyCode);
|
||||
if(e.keyCode==13)
|
||||
{
|
||||
alert("엔터키 이벤트");
|
||||
}
|
||||
});
|
||||
*/
|
||||
/*
|
||||
$('#userId').keypress(function(event){
|
||||
|
||||
alert(event.keyCode);
|
||||
if ( event.keyCode == 27 || event.which == 27 ) {
|
||||
|
||||
}
|
||||
});
|
||||
*/
|
||||
|
||||
<c:if test="${!empty strErrorMsg}">alert("${strErrorMsg}");</c:if>
|
||||
|
||||
</script>
|
||||
|
||||
<body>
|
||||
<div style="display: flex;align-items: flex-start;">
|
||||
|
||||
<!-- login :s -->
|
||||
<div class="logback">
|
||||
</div>
|
||||
|
||||
<!-- login :s -->
|
||||
<div class="logback">
|
||||
<h1><img src="${ctx}/branding/logo" alt="uWorks Portal logo"></h1>
|
||||
<h3>urITSM 에 오신것을 환영합니다.</h3>
|
||||
<!-- login_box :s -->
|
||||
<div class="login_box">
|
||||
<!-- loginWrap :s -->
|
||||
<div class="loginWrap">
|
||||
<div class="input_wrap">
|
||||
|
||||
<form:form id="loginForm" name="loginForm" method="post">
|
||||
|
||||
<label for="member_id" class="hidden">아이디 입력</label>
|
||||
<input type="text" name="userId" id="userId" class="txt_id" placeholder="아이디">
|
||||
<label for="member_pw" class="hidden">비밀번호 입력</label>
|
||||
<input type="password" name="password" id="password" class="txt_pw" placeholder="비밀번호">
|
||||
<p>
|
||||
<span class="save_id">
|
||||
<input type="checkbox" name="remember_id" id="remember_id" value="" checked>
|
||||
<label for="remember_id">아이디 저장</label>
|
||||
</span>
|
||||
</p>
|
||||
<button type="button" class="btn_login" onclick="javascript:actionLogin()" >로그인</button>
|
||||
|
||||
</form:form>
|
||||
|
||||
<div class="btn_group">
|
||||
<div>
|
||||
<button type="button" class="btn-function" title="ID 찾기" onclick="fncIdFindOpen(); return false;" style="background: cadetblue;" >ID 찾기</button>
|
||||
<button type="button" class="btn-function" title="패스워드초기화" onclick="fncPopPassworkdResetOpen(); return false;" style="background: cadetblue;" >PASSWORD 초기화</button>
|
||||
|
||||
<button type="button" class="btn-function" title="회원가입" onclick="fncPopUserRegistOpen(); return false;" style="background: blue;" >회원가입</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!--//loginWrap :e -->
|
||||
</div>
|
||||
<!--//login_box :e -->
|
||||
</div>
|
||||
<!--//login :e -->
|
||||
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
|
||||
<%--
|
||||
Class Name : LoginUsr.jsp
|
||||
Description : 로그인화면
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2025.01.03 나혁제 최초생성
|
||||
|
||||
author : 인프라본부 나혁제
|
||||
since : 2025.01.02
|
||||
--%>
|
||||
<%@ 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="form" uri="http://www.springframework.org/tags/form" %>
|
||||
|
||||
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
|
||||
|
||||
<title> UR-ITSM </title>
|
||||
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>urITSM</title>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<meta name="keywords" content="uWorks Portal">
|
||||
<meta name="description" content="uWorks Portal에 오신것을 환영합니다.">
|
||||
<link rel="stylesheet" type="text/css" href="${ctx}/css/import.css">
|
||||
<script type="text/javascript" src="${ctx}/js/jquery-2.2.4.min.js"></script>
|
||||
|
||||
<script type="text/javascript" src="${ctx}/js/common_script.js"></script>
|
||||
<link rel="stylesheet" href="${ctx}/js/js-calendar/calendar-jquery-ui.css">
|
||||
|
||||
<script type="text/javascript" src="${ctx}/js/js-calendar/jquery.js"></script>
|
||||
<script type="text/javascript" src="${ctx}/js/js-calendar/jquery-ui.js"></script>
|
||||
<script type="text/javascript" src="${ctx}/js/js-calendar/calendar.js"></script>
|
||||
|
||||
</head>
|
||||
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
//----------------------------------------
|
||||
// 화면 초기화
|
||||
// ----------------------------------------
|
||||
$(document).ready(function()
|
||||
{
|
||||
var strCookieLoginId = getCookie("saveId");
|
||||
|
||||
if(strCookieLoginId != '')
|
||||
{
|
||||
$("#remember_id").prop("checked", true);
|
||||
}
|
||||
else
|
||||
{
|
||||
$("#remember_id").prop("checked", false);
|
||||
}
|
||||
|
||||
$("#userId").val(strCookieLoginId);
|
||||
|
||||
$("#userId, #password").keydown(function(e) {
|
||||
|
||||
if (e.key === "Enter")
|
||||
{
|
||||
actionLogin();
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
function actionLogin()
|
||||
{
|
||||
if (document.loginForm.userId.value =="")
|
||||
{
|
||||
alert("아이디를 입력하세요");
|
||||
return false;
|
||||
}
|
||||
else if (document.loginForm.password.value =="")
|
||||
{
|
||||
alert("비밀번호를 입력하세요");
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 체크 시 쿠키에 ID 저장
|
||||
if($("#remember_id").prop("checked"))
|
||||
{
|
||||
setCookie("saveId", $("#userId").val(), 7); // 7일간 ID 저장
|
||||
}
|
||||
// 체크 해제 시 쿠키에서 ID 삭제
|
||||
else
|
||||
{
|
||||
deleteCookie("saveId");
|
||||
}
|
||||
|
||||
// document.loginForm.action="<c:url value='/main/actionSecurityLogin.do'/>";
|
||||
document.loginForm.action="/";
|
||||
document.loginForm.submit();
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 쿠키 조회
|
||||
// ----------------------------------------
|
||||
function getCookie(name)
|
||||
{
|
||||
const cookie = document.cookie;
|
||||
|
||||
if (document.cookie != "")
|
||||
{
|
||||
var cookieArray = cookie.split("; ");
|
||||
for ( var index in cookieArray)
|
||||
{
|
||||
var cookieName = cookieArray[index].split("=");
|
||||
if (cookieName[0] == name)
|
||||
{
|
||||
return cookieName[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
return "" ;
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 쿠키 설정
|
||||
// ----------------------------------------
|
||||
function setCookie(name,value,expiredays)
|
||||
{
|
||||
const date = new Date();
|
||||
date.setDate(date.getDate() + expiredays);
|
||||
document.cookie = escape(name) + "=" + escape(value) + "; path=/; expires=" + date.toUTCString();
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 쿠키 삭제
|
||||
// ----------------------------------------
|
||||
function deleteCookie(name)
|
||||
{
|
||||
const expireDate = new Date();
|
||||
expireDate.setDate(expireDate.getDate() - 1);
|
||||
document.cookie = name + "= " + "; expires=" + expireDate.toGMTString();
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 2026.01.14 나혁제 추가
|
||||
// ID 찾기
|
||||
// ----------------------------------------
|
||||
function fncIdFindOpen()
|
||||
{
|
||||
PopupOpen("/main/PopIdFind", 470, 450, '');
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 2026.01.14 나혁제 추가
|
||||
// 패스워드 초기화
|
||||
// ----------------------------------------
|
||||
function fncPopPassworkdResetOpen()
|
||||
{
|
||||
PopupOpen("/main/PopPasswordReset", 380, 450, '');
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 2026.01.19 나혁제 추가
|
||||
// 패스워드 초기화
|
||||
// ----------------------------------------
|
||||
function fncPopUserRegistOpen()
|
||||
{
|
||||
// PopupOpen("/main/PopUserRegist", 380, 800, '');
|
||||
|
||||
var $dialog = $('<div></div>')
|
||||
.html('<iframe style="border: 0px; " src="/main/noAuthUserInsertView.do" width="100%" height="100%"></iframe>')
|
||||
.dialog({
|
||||
autoOpen: false
|
||||
, modal: true
|
||||
, height: 600
|
||||
, width: 800
|
||||
, title: '회원가입'
|
||||
, open: function (event, ui)
|
||||
{
|
||||
$(".ui-icon-closethick").remove(); // 닫기 버튼 제거
|
||||
$('.ui-dialog-titlebar-close').css({
|
||||
width: '30px' // 닫기 버튼 너비
|
||||
// , height: '50px' // 닫기 버튼 높이
|
||||
});
|
||||
$(this).parent().find(".ui-dialog-titlebar").hide(); // 타이틀바 안보이게 처리
|
||||
}
|
||||
|
||||
, closeText: '닫기'
|
||||
});
|
||||
|
||||
$dialog.dialog('open');
|
||||
|
||||
// 팝업 화면 맨앞으로 배치
|
||||
$(".ui-dialog").css("z-index", "99");
|
||||
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// 팝업 오픈
|
||||
// ----------------------------------------
|
||||
function PopupOpen(strUrl, hei, wid, pagetitle)
|
||||
{
|
||||
var page = "/common/PageRedirection.do?Page="+ strUrl
|
||||
+ "&PopupYn=B";
|
||||
|
||||
var $dialog = $('<div></div>')
|
||||
.html('<iframe style="border: 0px; " src="' + page + '" width="100%" height="100%"></iframe>')
|
||||
.dialog({
|
||||
autoOpen: false
|
||||
, modal: true
|
||||
, height: hei
|
||||
, width: wid
|
||||
, title: pagetitle
|
||||
, open: function (event, ui)
|
||||
{
|
||||
$(".ui-icon-closethick").remove(); // 닫기 버튼 제거
|
||||
$('.ui-dialog-titlebar-close').css({
|
||||
width: '30px' // 닫기 버튼 너비
|
||||
// , height: '50px' // 닫기 버튼 높이
|
||||
});
|
||||
$(this).parent().find(".ui-dialog-titlebar").hide(); // 타이틀바 안보이게 처리
|
||||
}
|
||||
|
||||
, closeText: '닫기'
|
||||
});
|
||||
|
||||
$dialog.dialog('open');
|
||||
|
||||
// 팝업 화면 맨앞으로 배치
|
||||
$(".ui-dialog").css("z-index", "99");
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
$("#userId").keypress(function(e)
|
||||
{
|
||||
alert(e.keyCode);
|
||||
if(e.keyCode==13)
|
||||
{
|
||||
alert("엔터키 이벤트");
|
||||
}
|
||||
});
|
||||
*/
|
||||
/*
|
||||
$('#userId').keypress(function(event){
|
||||
|
||||
alert(event.keyCode);
|
||||
if ( event.keyCode == 27 || event.which == 27 ) {
|
||||
|
||||
}
|
||||
});
|
||||
*/
|
||||
|
||||
<c:if test="${!empty strErrorMsg}">alert("${strErrorMsg}");</c:if>
|
||||
|
||||
</script>
|
||||
|
||||
<body>
|
||||
<div style="display: flex;align-items: flex-start;">
|
||||
|
||||
<!-- login :s -->
|
||||
<div class="logback">
|
||||
</div>
|
||||
|
||||
<!-- login :s -->
|
||||
<div class="logback">
|
||||
<h1><img src="${ctx}/images/main/logo.png" alt="uWorks Portal logo"></h1>
|
||||
<h3>urITSM 에 오신것을 환영합니다.</h3>
|
||||
<!-- login_box :s -->
|
||||
<div class="login_box">
|
||||
<!-- loginWrap :s -->
|
||||
<div class="loginWrap">
|
||||
<div class="input_wrap">
|
||||
|
||||
<form:form id="loginForm" name="loginForm" method="post">
|
||||
|
||||
<label for="member_id" class="hidden">아이디 입력</label>
|
||||
<input type="text" name="userId" id="userId" class="txt_id" placeholder="아이디">
|
||||
<label for="member_pw" class="hidden">비밀번호 입력</label>
|
||||
<input type="password" name="password" id="password" class="txt_pw" placeholder="비밀번호">
|
||||
<p>
|
||||
<span class="save_id">
|
||||
<input type="checkbox" name="remember_id" id="remember_id" value="" checked>
|
||||
<label for="remember_id">아이디 저장</label>
|
||||
</span>
|
||||
</p>
|
||||
<button type="button" class="btn_login" onclick="javascript:actionLogin()" >로그인</button>
|
||||
|
||||
</form:form>
|
||||
|
||||
<div class="btn_group">
|
||||
<div>
|
||||
<button type="button" class="btn-function" title="ID 찾기" onclick="fncIdFindOpen(); return false;" style="background: cadetblue;" >ID 찾기</button>
|
||||
<button type="button" class="btn-function" title="패스워드초기화" onclick="fncPopPassworkdResetOpen(); return false;" style="background: cadetblue;" >PASSWORD 초기화</button>
|
||||
|
||||
<button type="button" class="btn-function" title="회원가입" onclick="fncPopUserRegistOpen(); return false;" style="background: blue;" >회원가입</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!--//loginWrap :e -->
|
||||
</div>
|
||||
<!--//login_box :e -->
|
||||
</div>
|
||||
<!--//login :e -->
|
||||
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@ -319,7 +319,7 @@
|
||||
|
||||
<!-- Right: 로그인 박스 -->
|
||||
<div class="login-right">
|
||||
<h1><img src="${ctx}/branding/logo" alt="uWorks Portal logo"></h1>
|
||||
<h1><img src="${ctx}/images/main/logo.png" alt="uWorks Portal logo"></h1>
|
||||
</br>
|
||||
<h3>urITSM 에 오신것을 환영합니다.</h3>
|
||||
|
||||
@ -361,12 +361,12 @@
|
||||
<%--
|
||||
<!-- login :s -->
|
||||
<div class="login-left"" >
|
||||
<img src="${ctx}/branding/logo" alt="uWorks Portal logo" style="width:400px;">
|
||||
<img src="${ctx}/images/main/logo.png" alt="uWorks Portal logo" style="width:400px;">
|
||||
</div>
|
||||
|
||||
<!-- login :s -->
|
||||
<div class="login-container" style="width:40%;text-align:center;padding-left: 5px;align-self: center;">
|
||||
<h1><img src="${ctx}/branding/logo" alt="uWorks Portal logo"></h1>
|
||||
<h1><img src="${ctx}/images/main/logo.png" alt="uWorks Portal logo"></h1>
|
||||
<h3>urITSM 에 오신것을 환영합니다.</h3>
|
||||
<!-- login_box :s -->
|
||||
<div class="login_box">
|
||||
|
||||
@ -74,7 +74,7 @@
|
||||
// 서블릿 통신
|
||||
var proc =
|
||||
{
|
||||
// 서비스 처리완료
|
||||
// 인스던트 처리완료
|
||||
fn_id_find : function ()
|
||||
{
|
||||
var form = $('#PopIdFind')[0];
|
||||
|
||||
@ -103,15 +103,7 @@
|
||||
}
|
||||
else
|
||||
{
|
||||
// 2026.07.19 SR#1 : 서버 안내 메시지(계정 잠금 등) 우선 노출
|
||||
if(data.resultMsg != null && data.resultMsg != "")
|
||||
{
|
||||
alert(data.resultMsg);
|
||||
}
|
||||
else
|
||||
{
|
||||
alert("비밀번호 초기화에 실패하였습니다. \n사용자정보을 확인해주시길 바랍니다.");
|
||||
}
|
||||
alert("비밀번호 초기화에 실패하였습니다. \n사용자정보을 확인해주시길 바랍니다.");
|
||||
}
|
||||
// alert(JSON.stringify(data));
|
||||
// $('#userId').val(data.userId);
|
||||
|
||||
@ -19,7 +19,7 @@
|
||||
<div class="box">
|
||||
<p class="fLogo"><img src="<c:url value='/'/>images/main/footer_logo.png" alt="urAIRPA 시스템 logo"></p>
|
||||
<address>서울시 강서구 양천로 570(등촌동 NH서울타워 5층), (주)유알피</address>
|
||||
<p class="copy">COPYRIGHT © 2024 URP. All Right Reserved</p><!-- 2026.07.19 SR#23 오타(20242) 수정 -->
|
||||
<p class="copy">COPYRIGHT © 20242 URP. All Right Reserved</p>
|
||||
<%-- 2025.06.11 나혁제 불필요한 부분
|
||||
<ul class="menu">
|
||||
<li><a href="#" title="Privacy policy">Privacy policy</a></li>
|
||||
|
||||
@ -99,8 +99,7 @@
|
||||
|
||||
<div class="header-top">
|
||||
<div class="header-inner">
|
||||
<%-- 2026.07.19 기능개선12/F12 : 상단 헤더 로고를 브랜딩 엔드포인트(KIC 기본/업로드본)로 참조 --%>
|
||||
<a href="<c:url value='/'/>main/mainPage.do"><h1 class="logo" title="uWorks Portal" style="background-image:url('<c:url value="/branding/logo"/>'); background-size:contain; background-repeat:no-repeat; background-position:left center; text-indent:-9999px; overflow:hidden;">uWorks Portal</h1></a>
|
||||
<a href="<c:url value='/'/>main/mainPage.do"><h1 class="logo" title="uWorks Portal">uWorks Portal</h1></a>
|
||||
|
||||
<%
|
||||
TokenInfo tokenInfo = (TokenInfo)session.getAttribute("tokenInfo");
|
||||
|
||||
@ -1,72 +1,72 @@
|
||||
<%--
|
||||
Class Name : uritms-base-main1.jsp
|
||||
Description : Tiles 기본 Base 화면
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2025.01.03 나혁제 최초 생성
|
||||
|
||||
author : urp 인프라본부 나혁제
|
||||
since : 2025.01.03
|
||||
--%>
|
||||
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
|
||||
|
||||
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
|
||||
|
||||
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<title>urITSM</title>
|
||||
|
||||
<meta http-equiv="Content-Language" content="ko" >
|
||||
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<meta name="keywords" content="urITSM">
|
||||
<meta name="description" content="urITSM 에 오신것을 환영합니다.">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
<link rel="shortcut icon" href="${pageContext.request.contextPath}/branding/favicon" type="image/x-icon"><!-- F12 KIC 파비콘 -->
|
||||
|
||||
<link rel="stylesheet" href="${ctx}/js/js-calendar/calendar-jquery-ui.css">
|
||||
<script type="text/javascript" src="${ctx}/ js/jquery-2.2.4.min.js"></script>
|
||||
<script type="text/javascript" src="${ctx}/js/js-calendar/jquery.js"></script>
|
||||
<script type="text/javascript" src="${ctx}/js/js-calendar/jquery-ui.js"></script>
|
||||
<script type="text/javascript" src="${ctx}/js/js-calendar/calendar.js"></script>
|
||||
|
||||
<!-- bootstrap -->
|
||||
<!--
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
|
||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4" crossorigin="anonymous"></script>
|
||||
-->
|
||||
<!-- bootstrap end -->
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="${ctx}/css/import.css?ver=1">
|
||||
<%--
|
||||
<link rel="stylesheet" type="text/css" href="${ctx}/css/responsive.css?ver=1">
|
||||
--%>
|
||||
|
||||
<script type="text/javascript" src="${ctx}/js/common_script.js?ver=1"></script>
|
||||
|
||||
|
||||
</head>
|
||||
|
||||
|
||||
<body onload="">
|
||||
<!-- <div id="wrap"> -->
|
||||
<div class="wrap">
|
||||
<tiles:insertAttribute name="header"/>
|
||||
<tiles:insertAttribute name="body"/>
|
||||
<tiles:insertAttribute name="footer"/>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
<%--
|
||||
Class Name : uritms-base-main1.jsp
|
||||
Description : Tiles 기본 Base 화면
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2025.01.03 나혁제 최초 생성
|
||||
|
||||
author : urp 인프라본부 나혁제
|
||||
since : 2025.01.03
|
||||
--%>
|
||||
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
|
||||
|
||||
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
|
||||
|
||||
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<title>urITSM</title>
|
||||
|
||||
<meta http-equiv="Content-Language" content="ko" >
|
||||
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<meta name="keywords" content="urITSM">
|
||||
<meta name="description" content="urITSM 에 오신것을 환영합니다.">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
<link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon">
|
||||
|
||||
<link rel="stylesheet" href="${ctx}/js/js-calendar/calendar-jquery-ui.css">
|
||||
<script type="text/javascript" src="${ctx}/ js/jquery-2.2.4.min.js"></script>
|
||||
<script type="text/javascript" src="${ctx}/js/js-calendar/jquery.js"></script>
|
||||
<script type="text/javascript" src="${ctx}/js/js-calendar/jquery-ui.js"></script>
|
||||
<script type="text/javascript" src="${ctx}/js/js-calendar/calendar.js"></script>
|
||||
|
||||
<!-- bootstrap -->
|
||||
<!--
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
|
||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4" crossorigin="anonymous"></script>
|
||||
-->
|
||||
<!-- bootstrap end -->
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="${ctx}/css/import.css?ver=1">
|
||||
<%--
|
||||
<link rel="stylesheet" type="text/css" href="${ctx}/css/responsive.css?ver=1">
|
||||
--%>
|
||||
|
||||
<script type="text/javascript" src="${ctx}/js/common_script.js?ver=1"></script>
|
||||
|
||||
|
||||
</head>
|
||||
|
||||
|
||||
<body onload="">
|
||||
<!-- <div id="wrap"> -->
|
||||
<div class="wrap">
|
||||
<tiles:insertAttribute name="header"/>
|
||||
<tiles:insertAttribute name="body"/>
|
||||
<tiles:insertAttribute name="footer"/>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@ -1,78 +1,78 @@
|
||||
<%--
|
||||
Class Name : portal-base-main1.jsp
|
||||
Description : Tiles 기본 Base 화면
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2025.01.06 나혁제 최초 생성
|
||||
|
||||
author : urp 인프라본부 나혁제
|
||||
since : 2025.01.06
|
||||
--%>
|
||||
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
|
||||
|
||||
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
|
||||
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
|
||||
|
||||
<%-- 2025.11.24 나혁제 필요한 부분만 적용
|
||||
// 뒤로가기 가능하게..
|
||||
response.setHeader("Cache-Control", "public, max-age=600");
|
||||
response.setHeader("Pragma", "public");
|
||||
response.setDateHeader("Expires", System.currentTimeMillis() + 600000);
|
||||
--%>
|
||||
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Language" content="ko" >
|
||||
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<meta name="keywords" content="urITSM">
|
||||
<meta name="description" content="urITSM 에 오신것을 환영합니다.">
|
||||
|
||||
<link rel="shortcut icon" href="${pageContext.request.contextPath}/branding/favicon" type="image/x-icon"><!-- F12 KIC 파비콘 -->
|
||||
|
||||
<link rel="stylesheet" href="${ctx}/js/js-calendar/calendar-jquery-ui.css">
|
||||
<script type="text/javascript" src="${ctx}/js/jquery-2.2.4.min.js"></script>
|
||||
<script type="text/javascript" src="${ctx}/js/js-calendar/jquery.js"></script>
|
||||
<script type="text/javascript" src="${ctx}/js/js-calendar/jquery-ui.js"></script>
|
||||
<script type="text/javascript" src="${ctx}/js/js-calendar/calendar.js"></script>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="${ctx}/css/import.css">
|
||||
<script type="text/javascript" src="${ctx}/js/common_script.js"></script>
|
||||
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="wrap">
|
||||
<tiles:insertAttribute name="header"/>
|
||||
|
||||
<!-- container :s -->
|
||||
<div id="container">
|
||||
<!-- inner :s -->
|
||||
<!--
|
||||
<div class="inner clearfix">
|
||||
-->
|
||||
<div class="content clearfix">
|
||||
|
||||
<tiles:insertAttribute name="left"/>
|
||||
<tiles:insertAttribute name="body"/>
|
||||
</div>
|
||||
<!--//inner :e -->
|
||||
</div>
|
||||
<!--//container :e -->
|
||||
|
||||
<tiles:insertAttribute name="footer"/>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
|
||||
<%--
|
||||
Class Name : portal-base-main1.jsp
|
||||
Description : Tiles 기본 Base 화면
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2025.01.06 나혁제 최초 생성
|
||||
|
||||
author : urp 인프라본부 나혁제
|
||||
since : 2025.01.06
|
||||
--%>
|
||||
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
|
||||
|
||||
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
|
||||
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
|
||||
|
||||
<%-- 2025.11.24 나혁제 필요한 부분만 적용
|
||||
// 뒤로가기 가능하게..
|
||||
response.setHeader("Cache-Control", "public, max-age=600");
|
||||
response.setHeader("Pragma", "public");
|
||||
response.setDateHeader("Expires", System.currentTimeMillis() + 600000);
|
||||
--%>
|
||||
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Language" content="ko" >
|
||||
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<meta name="keywords" content="urITSM">
|
||||
<meta name="description" content="urITSM 에 오신것을 환영합니다.">
|
||||
|
||||
<link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon">
|
||||
|
||||
<link rel="stylesheet" href="${ctx}/js/js-calendar/calendar-jquery-ui.css">
|
||||
<script type="text/javascript" src="${ctx}/js/jquery-2.2.4.min.js"></script>
|
||||
<script type="text/javascript" src="${ctx}/js/js-calendar/jquery.js"></script>
|
||||
<script type="text/javascript" src="${ctx}/js/js-calendar/jquery-ui.js"></script>
|
||||
<script type="text/javascript" src="${ctx}/js/js-calendar/calendar.js"></script>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="${ctx}/css/import.css">
|
||||
<script type="text/javascript" src="${ctx}/js/common_script.js"></script>
|
||||
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="wrap">
|
||||
<tiles:insertAttribute name="header"/>
|
||||
|
||||
<!-- container :s -->
|
||||
<div id="container">
|
||||
<!-- inner :s -->
|
||||
<!--
|
||||
<div class="inner clearfix">
|
||||
-->
|
||||
<div class="content clearfix">
|
||||
|
||||
<tiles:insertAttribute name="left"/>
|
||||
<tiles:insertAttribute name="body"/>
|
||||
</div>
|
||||
<!--//inner :e -->
|
||||
</div>
|
||||
<!--//container :e -->
|
||||
|
||||
<tiles:insertAttribute name="footer"/>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@ -30,7 +30,7 @@
|
||||
<meta name="keywords" content="urITSM">
|
||||
<meta name="description" content="urITSM 에 오신것을 환영합니다.">
|
||||
|
||||
<link rel="shortcut icon" href="${pageContext.request.contextPath}/branding/favicon" type="image/x-icon"><!-- F12 KIC 파비콘 -->
|
||||
<link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon">
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="${ctx}/css/import.css">
|
||||
<script type="text/javascript" src="${ctx}/js/jquery-2.2.4.min.js"></script>
|
||||
|
||||
@ -1,63 +1,63 @@
|
||||
<%--
|
||||
Class Name : portal-popup1.jsp
|
||||
Description : Tiles 팝업 화면
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2025.01.08 나혁제 최초 생성
|
||||
|
||||
author : urp 인프라본부 나혁제
|
||||
since : 2025.01.08
|
||||
--%>
|
||||
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
|
||||
|
||||
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
|
||||
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Language" content="ko" >
|
||||
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<meta name="keywords" content="urITSM">
|
||||
<meta name="description" content="urITSM 에 오신것을 환영합니다.">
|
||||
|
||||
<link rel="shortcut icon" href="${pageContext.request.contextPath}/branding/favicon" type="image/x-icon"><!-- F12 KIC 파비콘 -->
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="${ctx}/css/import.css">
|
||||
<script type="text/javascript" src="${ctx}/js/jquery-2.2.4.min.js"></script>
|
||||
|
||||
<script type="text/javascript" src="${ctx}/js/common_script.js"></script>
|
||||
|
||||
<link rel="stylesheet" href="${ctx}/js/js-calendar/calendar-jquery-ui.css">
|
||||
|
||||
<script type="text/javascript" src="${ctx}/js/js-calendar/jquery.js"></script>
|
||||
<script type="text/javascript" src="${ctx}/js/js-calendar/jquery-ui.js"></script>
|
||||
<script type="text/javascript" src="${ctx}/js/js-calendar/calendar.js"></script>
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="wrap">
|
||||
|
||||
<!-- container :s -->
|
||||
<div id="container">
|
||||
<!-- inner :s -->
|
||||
<div class="body_wrap" style=" width: 96%;text-align: center;margin-right:2%;">
|
||||
<tiles:insertAttribute name="body" />
|
||||
</div>
|
||||
<!--//inner :e -->
|
||||
</div>
|
||||
<!--//container :e -->
|
||||
|
||||
</div>
|
||||
</body>
|
||||
|
||||
<%--
|
||||
Class Name : portal-popup1.jsp
|
||||
Description : Tiles 팝업 화면
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2025.01.08 나혁제 최초 생성
|
||||
|
||||
author : urp 인프라본부 나혁제
|
||||
since : 2025.01.08
|
||||
--%>
|
||||
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
|
||||
|
||||
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
|
||||
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Language" content="ko" >
|
||||
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<meta name="keywords" content="urITSM">
|
||||
<meta name="description" content="urITSM 에 오신것을 환영합니다.">
|
||||
|
||||
<link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon">
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="${ctx}/css/import.css">
|
||||
<script type="text/javascript" src="${ctx}/js/jquery-2.2.4.min.js"></script>
|
||||
|
||||
<script type="text/javascript" src="${ctx}/js/common_script.js"></script>
|
||||
|
||||
<link rel="stylesheet" href="${ctx}/js/js-calendar/calendar-jquery-ui.css">
|
||||
|
||||
<script type="text/javascript" src="${ctx}/js/js-calendar/jquery.js"></script>
|
||||
<script type="text/javascript" src="${ctx}/js/js-calendar/jquery-ui.js"></script>
|
||||
<script type="text/javascript" src="${ctx}/js/js-calendar/calendar.js"></script>
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="wrap">
|
||||
|
||||
<!-- container :s -->
|
||||
<div id="container">
|
||||
<!-- inner :s -->
|
||||
<div class="body_wrap" style=" width: 96%;text-align: center;margin-right:2%;">
|
||||
<tiles:insertAttribute name="body" />
|
||||
</div>
|
||||
<!--//inner :e -->
|
||||
</div>
|
||||
<!--//container :e -->
|
||||
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.6 KiB |
@ -1,14 +0,0 @@
|
||||
<svg width="250" height="35" viewBox="0 0 250 35" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M119.793 26.5656V7.20582H123.696V13.2493H127.571V15.6822H123.696V26.5656H119.793ZM114.735 12.4581C115.416 12.9864 115.948 13.6462 116.333 14.4348C116.716 15.2312 116.91 16.0765 116.91 16.9837C116.91 18.6279 116.326 20.0376 115.145 21.2051C113.978 22.3751 112.558 22.9602 110.896 22.9602C109.233 22.9602 107.862 22.3777 106.664 21.2051C105.473 20.035 104.876 18.6279 104.876 16.9837C104.876 16.0765 105.078 15.2286 105.483 14.4348C105.886 13.6488 106.424 12.9864 107.084 12.4581H104.012V10.0536H108.943V6.92233H112.848V10.0536H117.776V12.4581H114.74H114.735ZM109.274 14.373C108.8 15.0997 108.558 15.9708 108.558 16.9837C108.558 17.9965 108.8 18.8702 109.274 19.6072C109.751 20.3469 110.296 20.7129 110.896 20.7129C111.495 20.7129 112.053 20.3469 112.522 19.6072C112.994 18.8676 113.226 17.9939 113.226 16.9837C113.226 15.9734 112.994 15.0997 112.522 14.373C112.05 13.6462 111.512 13.2802 110.896 13.2802C110.279 13.2802 109.751 13.6462 109.274 14.373ZM112.265 30.9932H124.53V33.4029H111.051C110.281 33.4029 109.641 33.1452 109.129 32.6401C108.616 32.1324 108.359 31.4365 108.359 30.55V24.9188H112.265V30.9907V30.9932Z" fill="white"/>
|
||||
<path d="M131.619 7.38364H148.231V13.1385C148.231 13.8575 148.145 14.6358 147.963 15.4812C147.78 16.3265 147.55 16.9373 147.275 17.3161H151.018V19.7232H141.86V23.9318H148.17V33.421H144.297V26.3311H131.556V23.9318H137.957V19.7232H128.996V17.3161H143.877C144.073 16.7698 144.193 16.1383 144.246 15.4193C144.3 14.7054 144.323 13.9761 144.323 13.2364V9.78558H131.619V7.38364Z" fill="white"/>
|
||||
<path d="M159.62 14.7492V17.0893H172.644V19.4938H158.403C157.585 19.4938 156.943 19.231 156.448 18.7026C155.959 18.1769 155.711 17.4914 155.711 16.646V7.53827H172.387V9.94021H159.62V12.3782H172.293V14.7492H159.62ZM174.985 21.9628V24.3673H165.924V33.4467H162.019V24.3673H152.958V21.9628H174.985Z" fill="white"/>
|
||||
<path d="M193.768 7.22901H197.607V13.7776L201.516 13.7467V16.1822H197.607V33.4261H193.768V7.22901Z" fill="white"/>
|
||||
<path d="M224.654 20.9113H202.632V18.5068H209.676V12.7493H213.579V18.5068H224.654V20.9113ZM205.258 7.43261H221.906V12.6849C221.906 13.4658 221.799 14.2853 221.584 15.1358C221.373 15.9914 221.128 16.5765 220.853 16.8935H217.488C217.702 16.3445 217.844 15.7157 217.903 15.0121C217.967 14.306 218.003 13.5715 218.003 12.8138V9.87062H205.261V7.43261H205.258ZM218.255 24.1817C219.512 25.3569 220.147 26.7821 220.147 28.4676C220.147 30.1531 219.512 31.5551 218.255 32.7251C216.996 33.8952 215.479 34.4802 213.707 34.4802C211.935 34.4802 210.398 33.8952 209.143 32.7251C207.897 31.5551 207.277 30.1325 207.277 28.4676C207.277 26.8027 207.897 25.3569 209.143 24.1817C210.398 23.0143 211.912 22.4241 213.707 22.4241C215.502 22.4241 216.996 23.0143 218.255 24.1817ZM211.915 25.9394C211.428 26.679 211.178 27.5218 211.178 28.4676C211.178 29.4134 211.428 30.2201 211.915 30.9391C212.407 31.653 213.006 32.0112 213.709 32.0112C214.413 32.0112 215.004 31.653 215.491 30.9391C215.971 30.2201 216.208 29.4005 216.208 28.4676C216.208 27.5347 215.971 26.679 215.491 25.9394C215.004 25.2023 214.413 24.8312 213.709 24.8312C213.006 24.8312 212.409 25.2023 211.915 25.9394Z" fill="white"/>
|
||||
<path d="M187.018 10.5046V13.0509C187.018 15.5404 187.614 17.6769 188.84 19.4423C189.827 20.8546 191.657 22.1535 193.034 22.6019L191.114 24.4369C190.171 24.1663 188.789 23.3442 187.79 22.504C186.635 21.5298 185.455 20.4757 185.047 19.2799C184.642 20.4757 183.459 21.5298 182.306 22.504C181.304 23.3467 179.925 24.1663 178.979 24.4369L177.057 22.6019C178.439 22.1509 180.264 20.8546 181.253 19.4423C182.48 17.6769 183.079 15.5404 183.079 13.0509V10.5046H178.533V8.08206H191.494V10.5046H187.015" fill="white"/>
|
||||
<path d="M246.094 13.4916H250V15.8987H246.094V33.4261H242.219V7.22901H246.094V13.4916Z" fill="white"/>
|
||||
<path d="M235.083 7.79599V13.0509C235.083 15.5404 235.68 17.6769 236.904 19.4423C237.89 20.8546 239.723 22.1535 241.1 22.6019L239.178 24.4369C238.237 24.1663 236.853 23.3442 235.851 22.504C234.696 21.5298 233.521 20.4757 233.11 19.2799C232.702 20.4757 231.525 21.5298 230.37 22.504C229.373 23.3467 227.986 24.1663 227.045 24.4369L225.123 22.6019C226.5 22.1509 228.333 20.8546 229.317 19.4423C230.543 17.6769 231.142 15.5404 231.142 13.0509V7.79599H235.081H235.083Z" fill="white"/>
|
||||
<path d="M72.1269 21.5504V26.8955C72.1269 28.666 70.6814 30.1015 68.8917 30.1015C67.1021 30.1015 65.6566 28.666 65.6566 26.8955V7.24705C65.6566 5.47394 67.1021 4.04103 68.8917 4.04103C70.6814 4.04103 72.1269 5.47394 72.1269 7.24705V12.5329H81.3863V11.9736C81.3863 6.63368 81.7355 0 68.8943 0C56.053 0 56.4023 6.63368 56.4023 11.9736V22.169C56.4023 27.5089 56.0505 34.1426 68.8943 34.1426C81.7381 34.1426 81.3863 27.5089 81.3863 22.169V21.5504H72.1269Z" fill="white"/>
|
||||
<path d="M9.25426 0.682953H0V33.4055H9.25426V0.682953Z" fill="white"/>
|
||||
<path d="M31.541 33.4029L19.4034 17.012L28.9151 0.682953H19.0872L12.3543 12.5664C11.1485 14.7157 10.0522 17.3677 12.1376 20.4551L20.9304 33.4055H31.5384L31.541 33.4029Z" fill="white"/>
|
||||
<path d="M46.8578 0.78862H37.6035V33.5112H46.8578V0.78862Z" fill="white"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 5.0 KiB |
@ -1,13 +0,0 @@
|
||||
android/
|
||||
ios/
|
||||
node_modules/
|
||||
.git/
|
||||
.expo/
|
||||
dist/
|
||||
*.apk
|
||||
*.log
|
||||
build_final.json
|
||||
logurl.txt
|
||||
gradle2.txt
|
||||
scripts/gen_icon.js
|
||||
poll_build.sh
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user